2015-05-07 3 views
1

У меня есть куча текстовых файлов (по имени install*), в которых мне нужно заменить выражение curl -L на выражение curl -k -L. Я на OS X 10, Йосемити.sed - заменить шаблоны пробелами на OS X

Следующие попытки не работают:

sed -e "s/'curl -L'/'curl -k -L'/g" install* 

sed -i '' -e "s/'curl -L'/'curl -k -L'/g" install* 

Содержимое файлов отображаются (как если бы я напечатал cat), но замена не производится.

Что я делаю неправильно?

ответ

1

Вашей проблема в том, что вы вложенность цитирования механизмов (разделители), когда вы не должны.

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

sed -i '' -e 's/curl -L/curl -k -L/g' install* 

Используя одиночные кавычки, сценарий защищен от случайного толкования по оболочка.
Если вы хотите, чтобы оболочка для интерпретации частей sed сценария заранее, сплайсинга этих частей в как двойных -quoted строк.

Для sed «s s функции, то /, что выступает в качестве разделителя - не дополнительных цитировал из строк между / случаями необходимо использовать, и ваше использование ' просто вызывает sed рассматривать эти одиночные кавычки часть регулярного выражения для соответствия/строка замены. (В стороне: вы можете выбрать разделитель, отличный от /).

Тем не менее, если вам нужно, чтобы заставить интерпретацию некоторых символов, как литералов, использования \ -escaping, например, с помощью \. в регулярных выражениях для представления буквального. Это только quoting механизм, который sed сам поддерживает.

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

Для родового способа избежать строк для использования в качестве литералов в таких ситуациях см https://stackoverflow.com/a/29613573/45375.

+1

Спасибо @ mklement0 за функциональный пример и специально за подробное объяснение. Я многому научился из этого ответа. – thiagoveloso

+1

@thiagoveloso: Мое удовольствие; Я рад слышать это. – mklement0

1

Необходимо -i.

GNU sed использует -i без аргументов, которые означают «заменить на месте».

BSD СЭД нужен пустой аргумент, так что вам придется использовать sed -i '' -e '...' install*

Там нет переносимого способа сделать это с СЕПГОМ ...

+0

Он работает, но все равно не влияет на файлы. Я отредактировал вопрос, чтобы отразить эту дополнительную попытку. – thiagoveloso

+2

Хорошая разность указателей между GNU и BSD sed, но '-i' сама по себе - _with our без опции-argument_ - означает« обновление на месте »- опция-_argument_ просто указывает суффикс (расширение имени файла) для присоединения к _backup_ исходного файла. Поскольку GNU 'sed' считает этот параметр-аргумент _optional_,' -i' достаточно, чтобы сказать «не создавать файл резервной копии», тогда как BSD 'sed' рассматривает параметр-параметр _mandatory_, поэтому' -i '' 'должен использоваться для выражают одно и то же. – mklement0

+1

кричит, вы правы :) – izabera

Смежные вопросы