sed встроенное редактирование перестал работать для нескольких sed операторов

Для раскрытия этой тайны просто вводят apt-cache show gnome и созерцайте:

Описание: Рабочая среда GNOME, с дополнительными компонентами Это - Рабочая среда GNOME, интуитивный и привлекательный рабочий стол, с дополнительными компонентами.

Этот пакет зависит от стандартного распределения Рабочей среды GNOME, плюс полный спектр плагинов и других приложений, интегрирующихся с GNOME и Debian, обеспечивая самую лучшую среду до настоящего времени.

3
12.01.2012, 09:50
4 ответа

Вашим sed является не-GNU (вероятно), таким образом-i для того, чтобы на месте отредактировать не поддерживается. Можно избежать его при помощи временного файла:

sed -i -e'/test1/s/^/#SB#/g' file1

становится

sed -e'/test1/s/^/#SB#/g' file1 > temp_file
mv temp_file file1

Конечно, можно сделать это лучше при помощи mktemp как это

tmpfile=`mktemp`; sed -e '/test1/s/^/#SB#/g' file1 > $tmpfile; mv $tmpfile file1

Абсолютно для предотвращения sed и перенаправления без временного файла, поскольку исходный файл станет усеченным.

1
27.01.2020, 21:24
  • 1
    Это работает на единственный оператор Sed. У меня есть несколько sed statments'.>' перезапишет предыдущую sed фиксацию оператора test1, test2, test3 являются строками поиска. Я хочу прокомментировать любую строку, которая содержит эти строки. sed -i -e'/test1/s/^/#SB#/g' file1 sed -i -e'/test2/s/^/#SB#/g' file1 sed -i -e'/test4/s/^/#SB#/g' file1 –  stasunny 12.01.2012, 15:17
  • 2
    Можно сделать один statment в случае с sed -e'/test1/s/^/#SB#/g' -e'/test2/s/^/#SB#/g' -e'/test4/s/^/#SB#/g' file1 или даже просто запишите им всем sed -e'/test[124]/s/^/#SB#/g' file1. Но используйте тщательно эту конструкцию. Ошибка в sed операторе испортит Ваш файл. $path CD "хоста –  rush 12.01.2012, 16:25
  • 3
    @stasunny: забудьте-i опцию, она не работает. Я записал, как к строкам комментария, имеющим test1 шаблон, но можно всегда много раз применять те же инструкции, изменяя тестовый шаблон каждый раз. Лучшее решение использовало бы несколько-e опций как Rush, показал Вам, всегда не забывая писать во временный файл. Еще лучше, по моему скромному мнению, записал бы sed сценарий, содержащий все строки и говорящий sed для использования того файла в качестве сценария. –  David Costa 12.01.2012, 18:32

-i аргументом sed является расширение GNU. Вы, вероятно, не выполняете GNU sed, который является, почему Вы получаете ошибку о -i быть нераспознанным.

2
27.01.2020, 21:24
  • 1
    какой-либо другой способ выполнить эту задачу? –  stasunny 12.01.2012, 11:09

Вы можете использовать Vim в режиме Ex:

ex -sc 'g/\vtest(1|2|4)/s/^/#SB#/' -cx file1
  1. g global regex

  2. \v включить магию

  3. s заменить

  4. x сохранить и закрыть

0
27.01.2020, 21:24

В ответах поясняется, что -iне является стандартным, в одном из них даже поясняется использование вместо него временного файла, но игнорируется главный вопрос, как это сделать для нескольких операторов.

Конечно, вы можете перенаправить каждое выражение и скопировать обратно после каждого выражения. Но вам все равно не нужны отдельные вызовы sedдля каждого оператора, вы можете указать несколько скриптов с несколькими-e:

sed -e '/test1/s/^/#SB#/g' -e '/test2/s/^/#SB#/g' -e' /test4/s/^/#SB#/g' file1

Или вы можете объединить sedкоманды с;:

sed '/test1/s/^/#SB#/g;/test2/s/^/#SB#/g;/test4/s/^/#SB#/g' file1

В вашем примере вы даже можете найти регулярное выражение для объединения замен:

sed '/test[124]/s/^/#SB#/g' file1

Ответ после того, как мы улучшим скрипт :Флаг gдля команд sозначает «заменить все вхождения в строке», но поскольку каждая строка имеет только одно начало (^), вы можете опустить это, так что ваша последняя работа

sed '/test[124]/s/^/#SB#/' file1 > /tmp/file1 && mv /tmp/file1 file1

(&&используется, чтобы избежать уничтожения файла в случае сбоя sed)

0
27.01.2020, 21:24

Теги

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