Я не знаком с крикуном, но это кажется, что streamripper - то, что Вы хотите. Это может уже быть доступно в Вашем дистрибутиве, или можно получить его по http://streamripper.sourceforge.net/
У меня нет проблем с [[: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
Вы можете сгруппировать выражение и использовать \1
, чтобы указать на группу. E.g
sed 's/^\($RELEASE.*=\).*/\1 '"'1234'"'/' config.ini