Добавить в конец строки, содержащей шаблон - с sed или awk

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

somestuff...
all: thing otherthing
some other stuff

Что я хочу сделать, так это добавить в строку, начинающуюся с all: следующим образом:

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

Возможно, я смогу сделать это с помощью sed, но я не очень хорошо разбираюсь в sed, так может ли кто-нибудь помочь с ним?

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Объяснение

  • /patt/ {...}, если строка соответствует шаблону, заданному patt, затем выполните действия, описанные в {}.
  • В этом случае: /^all:/ {$0=$0" anotherthing"}, если строка начинается (представлена ​​^) с помощью all:, затем добавьте anotherthing в строку.
  • 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

Ответ 4

Решение с awk:

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

Просто: если строка начинается с all, напечатайте строку плюс "anotherthing", иначе напечатайте только строку.

Ответ 5

В bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename