sed regex проблема

Я не знаком с крикуном, но это кажется, что streamripper - то, что Вы хотите. Это может уже быть доступно в Вашем дистрибутиве, или можно получить его по http://streamripper.sourceforge.net/

4
21.07.2014, 16:23
2 ответа

У меня нет проблем с [[:space:]]. Вот действительно глупый маленький пример, показывающий смешанную замену пробелов и табуляций:

$ echo -e 'A \t \t B' | sed 's/A[[:space:]]*B/WORKED/'
WORKED

Вы также можете использовать \s, которая часто предпочтительнее с большими sed строками, потому что она намного короче:

$ echo -e 'A \t \t B' | sed 's/A\s*B/WORKED/'
WORKED

В любом случае, я думаю, что ваша настоящая проблема в том, чтобы избежать этих хлопот с одиночными кавычками. Я считаю, что самый простой способ - это вырваться из одиночной строки кавычек и получить двойную кавычку, а затем (при необходимости) вернуться обратно в одиночную строку кавычек. Бэш автоматически сконцентрирует все это для вас.

$ echo 'This is a nice string and this is a single quote:'"'"' Nice?'
This is a nice string and this is a single quote:' Nice?

Итак, все пространство, которое мы сохранили с \s скоро будет уничтожено этой мега-ситуацией с кавычками:

$ echo -e '$RELEASE  \t = '"'"'1234'"'"';' |\
  sed 's/$RELEASE\s*=\s*'"'"'[0-9]*'"'"'\;/REPLACEMENT/'

Конечно, есть аргумент, что (поскольку это похоже на PHP-скрипт), вы можете предположить, что если строка начинается с $RELEASE[\s=]+, то вы можете просто заменить всю строку. Очевидно, что это не всегда так (все приложение может быть одной отвратительной строкой), но это делает ваш поиск и замену более приятным:

sed 's/$RELEASE[\s=]*.*/REPLACEMENT/'

И да, применяются общие правила использования sed. Не отгоняйте эхо в потоковом редакторе (как sed) и перенаправьте обратно в этот файл. Если Если работает, вы можете легко взломать этот файл.

Либо используйте аргумент -i (работает для sed), либо перейдите в приложение типа губки (что похоже на вывод с задержкой):

sed -i '...' file
sed '...' file | sponge file
2
27.01.2020, 21:00

Вы можете сгруппировать выражение и использовать \1, чтобы указать на группу. E.g

sed 's/^\($RELEASE.*=\).*/\1 '"'1234'"'/' config.ini
0
27.01.2020, 21:00

Теги

Похожие вопросы