Jak dodać na końcu linii zawierającej wzorzec z sed lub awk?

89

Oto przykładowy plik:

somestuff...
all: thing otherthing
some other stuff

Chcę dodać do wiersza, który zaczyna się od all:tego:

somestuff...
all: thing otherthing anotherthing
some other stuff
yasar
źródło

Odpowiedzi:

166

To działa dla mnie

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

Pierwsza część to wzorzec do znalezienia, a druga to podstawienie zwykłego seda z użyciem $końca linii.

Jeśli chcesz zmienić plik w trakcie procesu, użyj -iopcji

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

Lub możesz przekierować go do innego pliku

sed '/^all:/ s/$/ anotherthing/' file > output
user219882
źródło
Samo dodanie czegoś prowadzi do nowej linii, zastąp to właściwy sposób.
zhy
10

To powinno działać dla Ciebie

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

Używając polecenia s (substytucja), możesz wyszukać wiersz, który spełnia wyrażenie regularne. W powyższym poleceniu &oznacza dopasowany ciąg.

izidor
źródło
9

Możesz dołączyć tekst do $0w awk, jeśli spełnia warunek:

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

Wyjaśnienie

  • /patt/ {...}jeśli linia pasuje do wzorca podanego przez patt, wykonaj czynności opisane w {}.
  • W tym przypadku: /^all:/ {$0=$0" anotherthing"}jeśli linia zaczyna się (reprezentowana przez ^) od all:, to dołącz anotherthingdo linii.
  • 1jako prawdziwy warunek uruchamia domyślną akcję awk: wypisz bieżącą linię ( print $0). Dzieje się tak zawsze, więc zostanie wydrukowany wiersz oryginalny lub zmodyfikowany.

Test

Dla danego wpisu zwraca:

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

Pamiętaj, że możesz również podać tekst do dołączenia w zmiennej:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff
fedorqui 'SO przestań szkodzić'
źródło
Na Solarisie pojawi się błąd:awk: can't set $0
ceving
@ceving, możesz użyć /usr/xpg4/bin/awk„dobrego” awk.
fedorqui 'SO przestań szkodzić'
6

W bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename
glenn jackman
źródło
6

Oto kolejne proste rozwiązanie wykorzystujące sed.

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

Wyjaśnienie:

all. * oznacza wszystkie wiersze zaczynające się od „all”.

& reprezentują dopasowanie (tj. całą linię zaczynającą się od „all”)

następnie sed zamienia pierwsze na późniejsze i dołącza słowo „coś innego”

chenchuk
źródło
3

Rozwiązanie z awk:

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

Po prostu: jeśli wiersz zaczyna się od allprint the row plus „anotherthing”, w przeciwnym razie drukuje tylko wiersz.

Manlio
źródło
4
Możesz to skrócić do:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
glenn jackman
2
@Prometheus, skrypt awk składa się z condition {actions}par. Jeśli conditionzostanie pominięty, działania są wykonywane dla każdego rekordu. Jeśli {actions}zostaną pominięte, a warunek zostanie uznany za prawdziwy (co ma miejsce w przypadku liczby 1), wówczas domyślną akcją jest wydrukowanie bieżącego rekordu.
glenn jackman