Как добавить в конец строк, содержащих шаблон с sed или awk?


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

somestuff...
all: thing otherthing
some other stuff

что я хочу сделать, это добавить в строку, которая начинается с all: такой:

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

6 ответов:

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

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

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

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

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

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

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

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

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

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

в bash:

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

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

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

объяснение

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

тест

для вашего данного ввода он возвращает:

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

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

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {=mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

решение с awk:

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

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

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

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

объяснение:

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

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

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