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

89

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

somestuff...
all: thing otherthing
some other stuff

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

somestuff...
all: thing otherthing anotherthing
some other stuff
ясар
источник

Ответы:

166

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

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

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

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

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

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

sed '/^all:/ s/$/ anotherthing/' file > output
user219882
источник
Простое добавление чего-либо приводит к новой строке, замена - правильный путь.
zhy
10

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

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

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

Изидор
источник
9

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

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

Объяснение

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

Контрольная работа

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

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
fedorqui 'ТАК, хватит вредить'
источник
На Solaris вы получите сообщение об ошибке:awk: can't set $0
03
@ceving, тогда вы можете использовать /usr/xpg4/bin/awk"хороший" awk.
fedorqui 'SO, перестаньте причинять вред'
6

В bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename
Гленн Джекман
источник
6

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

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

Пояснение:

all. * означает, что все строки начинаются со слова «все».

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

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

Ченчук
источник
3

Решение с awk:

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

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

Манлио
источник
4
Вы можете сократить это до:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
Гленн Джекман
2
@Prometheus, сценарий awk состоит из condition {actions}пар. Если conditionопущен, действия выполняются для каждой записи. Если {actions}они опущены, а условие оценивается как истинное (как в случае с числом 1), то действие по умолчанию - распечатать текущую запись.
Гленн Джекман