Сделайте несколько правок одним вызовом sed


15

Я пытаюсь использовать sed для редактирования файла конфигурации. Есть несколько строк, которые я хотел бы изменить. Я знаю, что в Linux sed -iдопускается редактирование на месте, но это требует сохранения в файл резервной копии. Однако я бы хотел избежать нескольких файлов резервных копий и вносить все свои изменения сразу.

Есть ли способ сделать это с помощью sed -iили есть лучшая альтернатива?

Ответы:


21

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

sed -i -e 's/a/b/g' -e 's/b/d/g' fileвносит оба изменения в один файл с именем filein-place. Без резервного файла.

sed -ibak -e 's/a/b/g' -e 's/b/d/g' fileвносит оба изменения в один файл с именем filein-place. С одним файлом резервной копии имени filebak.


2
Обратите внимание, что последовательность имеет значение. В приведенном выше примере команды все экземпляры буквы aпревращаются в b, а затем все экземпляры bв d. Вы можете сделать то же самое с - sed -i -e 's/a\|b/d/g' fileповернуть все экземпляры aили bв d.
Уайлдкарт

4

Другой альтернативой является exпредшественник vi. Это на самом деле инструмент POSIX выбора для на месте сценария редактирования файла; он чрезвычайно гибок и, возможно, даже более переносим, ​​чем Perl. (Если вы остаетесь за пределами мира Windows, он, несомненно, более переносим, ​​чем Perl.)sed -i

Относительный недостаток в этом стеке примеров команд, использующих ex, по крайней мере по сравнению с множеством примеров команд, использующих sed, awkи Perl. Тем не менее, я сам вникал в спецификацию POSIXex и с тех пор бью по барабану. Я написал много ответов, используя exздесь и на стек-обмене vi / Vim:

Дальнейшее чтение:


3

Помимо нескольких -eопций, вы также можете разделить команды sed в одном сценарии sed, используя символы новой строки или точки с запятой.

Это тот случай, является ли этот скрипт однострочным в командной строке или файлом сценария.

например

sed -e 's/a/b/g ; s/b/d/g' file

Символы пробела вокруг ;являются необязательными. Я использовал их здесь, чтобы убедиться, что точка с запятой выделяется (в общем, за исключением символов новой строки, разделяющих команды, пробел между командами игнорируется ... но не забывайте, что пробел внутри команд может быть и обычно существенный).

или:

sed -e 's/a/b/g
        s/b/d/g' file
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.