Как добавить в конец строки, содержащие шаблон с помощью sed или awk? - PullRequest
79 голосов
/ 07 марта 2012

Вот пример файла:

somestuff...
all: thing otherthing
some other stuff

Я хочу добавить строку, начинающуюся с all:, например:

somestuff...
all: thing otherthing anotherthing
some other stuff

Ответы [ 6 ]

155 голосов
/ 07 марта 2012

Это работает для меня

sed '/^all:/ s/$/ anotherthing/' file

Первая часть - это шаблон для поиска, а вторая часть - это замена обычного sed с использованием $ для конца строки.

Если вы хотите изменить файл во время процесса, используйте -i option

sed -i '/^all:/ s/$/ anotherthing/' file

Или вы можете перенаправить его в другой файл

sed '/^all:/ s/$/ anotherthing/' file > output
9 голосов
/ 07 марта 2012

Это должно работать для вас

sed -e 's_^all: .*_& anotherthing_'

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

7 голосов
/ 25 января 2015

Вы можете добавить текст к $0 в awk, если он соответствует условию:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

Объяснение

  • /patt/ {...}, если строка соответствует шаблону, заданномуpatt, затем выполните действия, описанные в {}.
  • В этом случае: /^all:/ {$0=$0" anotherthing"}, если строка начинается (представлена ​​^) с all:, затем добавьте anotherthing кline.
  • 1 как истинное условие, запускает действие по умолчанию awk: вывести текущую строку (print $0).Это будет происходить всегда, поэтому будет либо печатать исходную или измененную строку.

Test

Для заданного вами ввода возвращается:

somestuff...
all: thing otherthing anotherthing
some other stuff

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

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff
5 голосов
/ 07 марта 2012

В Баш:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename
3 голосов
/ 04 июня 2018

Вот еще одно простое решение с использованием sed.

$ sed -i 's/all.*/& anotherthing/g' filename.txt

Объяснение:

all. * Означает, что все строки начинаются с 'all'.

& представляет совпадение (т. Е. Всю строку, начинающуюся с 'all')

затем sed заменяет первое на более позднее и добавляет слово 'elsething'

3 голосов
/ 07 марта 2012

Решение с помощью awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

Просто: если строка начинается с all, напечатайте строку плюс «еще что-то», иначе выведите только строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...