Добавить в конец строки, содержащей шаблон - с 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