Экранирование строк 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
несколько предупреждений и дополнений к тому, что все остальные уже сказали:
- The
-r
option-это расширение GNU для включения расширенных регулярных выражений. BSD производное использование sed-E
вместо. - Sed и Grep использовать Основные Регулярные Выражения
- на awk использует Расширенные Регулярные Выражения
- вы должны стать удобными с POSIX технические характеристики например стандарт IEEE 1003.1 СТД если вы хотите писать переносимые скрипты, файлы Makefile и т. д.
Я бы рекомендовал переписать выражение как
's/\([a-zA-Z0-9.]\{1,\}\) [0-9] \(.*\)/ ()/g'
который должен делать именно то, что вы хотите в любом POSIX-совместимом sed
. Если вы действительно заботитесь о таких вещах, подумайте об определении POSIXLY_CORRECT
переменные среды.
использование 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)