Muszę zastąpić całą linię z sed
, jeśli pasuje do wzorca. Na przykład, jeśli wiersz jest "jeden dwa sześć trzy cztery" i jeśli "szóstka" tam jest, wówczas cała linia powinna zostać zastąpiona "usterką".sed zastąpić całą linię, gdy pasuje znaleźć
Odpowiedz
Można to zrobić z jednej z nich:
sed 's/.*six.*/fault/' file # check all lines
sed '/six/s/.*/fault/' file # matched lines -> then remove
Robi się cały wiersz zawierający six
i zastępuje go fault
.
Przykład:
$ cat file
six
asdf
one two six
one isix
boo
$ sed 's/.*six.*/fault/' file
fault
asdf
fault
fault
boo
Jest on oparty na this solution do Replace whole line containing a string using Sed
Bardziej ogólnie, można użyć wyrażenia sed '/match/s/.*/replacement/' file
. Spowoduje to wykonanie wyrażenia sed 's/match/replacement/'
w wierszach zawierających match
. W twoim przypadku będzie to:
sed '/six/s/.*/fault/' file
Co jeśli mamy „jeden dwa sześć osiem jedenaście trzy cztery” i chcemy zawierać „osiem” i „jedenaście” jako nasz „zły” słowa?
W tym przypadku możemy użyć -e
dla wielu warunków:
sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file
i tak dalej.
Albo też:
sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file
Co, jeśli mamy "jeden dwa sześć osiem jedenaście trzy cztery" i chcemy włączyć "osiem" i "jedenaście" jako nasze "złe" słowa? Czy s /.* sześć | osiem | jedenaście. */Usterka/g działa? – irek
Jest to możliwe z '-e', zobacz moją zaktualizowaną odpowiedź. – fedorqui
Dziękuję za poświęcony czas! – irek
To może pracować dla Ciebie (GNU sed):
sed -e '/six/{c\fault' -e ';d}' file
czyli
sed '/six/{c\fault'$'\n'';d}' file
Nad odpowiedziami działało w porządku dla mnie, po prostu wspomnieć alternatywny sposób:
M Atch pojedynczy wzorzec i zastąpić nowym:
sed -i '/six/c fault' file
meczów wielokrotnego wzór i wymienić na nowy (polecenia złączenie):
sed -i -e '/one/c fault' -e '/six/c fault' file
Czy za 'grep -V'? – xato