Grep: wyszukaj i zamień pełną linię

13

Komenda

 grep "foo" myfile.txt

drukuje wszystkie pasujące linie w moim pliku.

Teraz chcę zastąpić pełną linię innym ciągiem. Jak mogę to zrobić?

Zacisk
źródło

Odpowiedzi:

13

Jeśli dopasowujesz podłańcuch całej linii, możesz użyć spolecenia sed z wyrażeniem regularnym, aby wycierać resztę linii:

sed -i 's/^.*foo.*$/another string/' myfile.txt

lub użyj cpolecenia, aby zastąpić dopasowaną linię za jednym razem:

sed -i '/foo/ { c \
another string
}' myfile.txt

Jeśli nie chcesz wpisywać poleceń wielowierszowych w wierszu polecenia, możesz zamiast tego umieścić je w skrypcie:

$ cat foo.sed
/foo/ { c \
another string
}

$ sed -i -f foo.sed myfile.txt
Bezużyteczny
źródło
dzięki! kiedy używam drugiej opcji, otrzymuję: sed: -e wyrażenie # 1, char 0: niedopasowane `{'
zacisk
na końcu pierwszego wiersza musisz wpisać \, a następnie nacisnąć Return - ważne jest, aby \ uciekł od pierwszej nowej linii. Następnie upewnij się, że }'jest na osobnej linii od another string: zamiennik jest wszystkim w drugiej linii, w tym }jeśli umieścisz ją tam.
Bezużyteczne
-1

Możesz użyć wbudowanej funkcji sed :

sed -i -e 's/foo/bar/' myfile.txt
Coren
źródło
To zastąpi tylko każdą fooz barnie całą linią.
Jahid