Найдите строку, содержащую путь UNIX, и закомментируйте ее из файла - PullRequest
2 голосов
/ 25 марта 2019

Мне бы хотелось, чтобы строка, содержащая 'start / usr / lib / sendmail "$ src_running"', была прокомментирована в файле

$ grep /usr/lib/sendmail /tmp/tcpip
# "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"


$ grep /usr/lib/sendmail /tmp/tcpip
# "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
#start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"

Ответы [ 3 ]

1 голос
/ 25 марта 2019

sed не может искать строки, только регулярные выражения (см. Можно ли надежно экранировать метасимволы регулярных выражений с помощью sed ), поэтому вам лучше использовать инструмент типа awk, который понимает строки, когда вы хотите совпадение по строке:

$ awk -v str='start /usr/lib/sendmail "$src_running"' 'index($0,str){$0="#"$0} 1' file
# "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
#start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"
0 голосов
/ 26 марта 2019

Так как стандартные AIX sed и awk не предлагают редактирование на месте, вы можете рассмотреть предшественник sed, ed! Это сценарий и редактирование файлов на месте, если вам нравится такой вид вещь:

ed -s /tmp/tcpip << 'EOF'
/start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF

Это вызывает ed для / tmp / tcpip с опцией -s, которая подавляет обычный отчет о количестве прочитанных и записанных байтов. Затем он отправляет ed a quoted here-документ, содержащий список команд. Я сделал цитируемый здесь документ, чтобы предотвратить любую непреднамеренную интерпретацию переменных, таких как $src_running.

Единственная интересная команда ed - это первая; Его цель - найти нужную нам строку и затем закомментировать ее. Последние две строки просто w записывают файл обратно на диск и q редактируют. Основная команда существует в двух частях:

  • адрес, указанный в диапазоне поиска /start \/usr\/lib\/sendmail "$src_running"/, и
  • действие, которое является поиском и заменой s/^/# /

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

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

ed -s /tmp/tcpip << 'EOF'
/^[^#]*start \/usr\/lib\/sendmail "$src_running"/s/^/# /
w
q
EOF

Разница в том, что мы требуем, чтобы запрос снова был привязан к началу строки (^), а затем следовали ноль или более (*) символов, которые не #[^#]).

0 голосов
/ 26 марта 2019

Здесь также подходит команда sed. Вот пример решения:

sed -r 's|start /usr/lib/sendmail "\$src_running"|#&|' inputfile

Объяснение:

Опция

-r обеспечивает расширенное регулярное выражение, избегая обширного цитирования. Но он специфичен для Linux и менее переносим по сравнению с другими версиями sed.

s команда sed для подстановки.

| маркер поиска шаблона и маркер замены шаблона

\$ в кавычках $, экранируя $ regexp привязку конца строки

#& шаблон замены, # - префикс комментария, а также соответствующий шаблон поиска

Надеюсь, это работает для вас.

...