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

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

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.


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

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

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”


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.