Экранирование строк sed правильно

у меня есть регулярное выражение и шаблон замены, которые были протестированы в Notepad++ на моих входных данных и работают правильно. Однако, когда я помещаю их в выражение sed, ничто не сопоставляется.

вот команда sed:

 # SEARCH = ([a-zA-Z0-9.]+) [0-9] (.*)
 # REPLACE =  ()

 sed -e 's/([a-zA-Z0-9.]+) [0-9] (.*)/ ()/g'

вот выборка данных:

jdoe 1 Doe, John
jad 1 Doe, Jane
smith 2 Smith, Jon

и желаемого результата:

Doe, John  (jdoe)
Doe, Jane  (jad)
Smith, Jon (smith)

Я попытался удалить и добавить эскейпы к различным символам в выражении sed, но либо ничего не получил или что-то вроде:--5-->

sed: -e expression #1, char 42: invalid reference  on `s' command's RHS

как я могу получить этот побег правильно?

5 ответов


обычно мне проще использовать переключатель-r, так как это означает, что экранирование похоже на большинство других языков:

sed -r 's/([a-zA-Z0-9.]+) [0-9] (.*)/ ()/g' file1.txt

несколько предупреждений и дополнений к тому, что все остальные уже сказали:

  1. The -r option-это расширение GNU для включения расширенных регулярных выражений. BSD производное использование sed -E вместо.
  2. Sed и Grep использовать Основные Регулярные Выражения
  3. на awk использует Расширенные Регулярные Выражения
  4. вы должны стать удобными с POSIX технические характеристики например стандарт IEEE 1003.1 СТД если вы хотите писать переносимые скрипты, файлы Makefile и т. д.

Я бы рекомендовал переписать выражение как

's/\([a-zA-Z0-9.]\{1,\}\) [0-9] \(.*\)/ ()/g'

который должен делать именно то, что вы хотите в любом POSIX-совместимом sed. Если вы действительно заботитесь о таких вещах, подумайте об определении POSIXLY_CORRECT переменные среды.


знак плюса должен быть экранирован, когда не используется -r переключатель.


использование awk намного проще...:

cat test.txt | awk '{ print  " "  " " "("")" }'

выход:

Doe, John (jdoe)
Doe, Jane (jad)
Smith, Jon (smith)

см. человек awk 1


$ sed -e 's/\([a-zA-Z0-9.].*\) [0-9] \(.*\)/ \(\)/g' file
Doe, John (jdoe)
Doe, Jane (jad)
Smith, Jon (smith)