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
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 -i
opcji
sed -i '/^all:/ s/$/ anotherthing/' file
Lub możesz przekierować go do innego pliku
sed '/^all:/ s/$/ anotherthing/' file > output
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.źródło
Możesz dołączyć tekst do
$0
w awk, jeśli spełnia warunek:awk '/^all:/ {$0=$0" anotherthing"} 1' file
Wyjaśnienie
/patt/ {...}
jeśli linia pasuje do wzorca podanego przezpatt
, wykonaj czynności opisane w{}
./^all:/ {$0=$0" anotherthing"}
jeśli linia zaczyna się (reprezentowana przez^
) odall:
, to dołączanotherthing
do linii.1
jako 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:
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
źródło
awk: can't set $0
/usr/xpg4/bin/awk
„dobrego” awk.W bash:
while read -r line ; do [[ $line == all:* ]] && line+=" anotherthing" echo "$line" done < filename
źródło
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”
źródło
Rozwiązanie z awk:
awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file
Po prostu: jeśli wiersz zaczyna się od
all
print the row plus „anotherthing”, w przeciwnym razie drukuje tylko wiersz.źródło
awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
condition {actions}
par. Jeślicondition
zostanie 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 liczby1
), wówczas domyślną akcją jest wydrukowanie bieżącego rekordu.