Narzędzie POSIX do skryptowych edycji pliku (zamiast drukowania zmodyfikowanej zawartości na standardowe wyjście) to ex
.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Oczywiście możesz go użyć,sed -i
jeśli Twoja wersja Sed go obsługuje, ale pamiętaj, że nie jest przenośny, jeśli piszesz skrypt przeznaczony do uruchamiania na różnych typach systemów.
David Foerster zapytał w komentarzach:
Czy jest jakiś powód, dla którego używasz printf
, a nie echo
czy coś takiego ex -c COMMAND
?
Odpowiedź: Tak
Dla printf
kontra echo
jest to kwestia przenośności; zobacz Dlaczego printf jest lepszy niż echo? Łatwiej jest także przeplatać znaki nowej linii między poleceniami printf
.
Dla printf ... | ex
kontra ex -c ...
jest to kwestia obsługi błędów. Dla tego konkretnego polecenia nie miałoby to znaczenia, ale ogólnie ma to znaczenie; na przykład spróbuj umieścić
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
w skrypcie. Porównaj z następującymi:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
Pierwszy zawiesza się i oczekuje na wejście; drugi zakończy działanie po otrzymaniu EOF przez ex
polecenie, więc skrypt będzie kontynuowany. Istnieją alternatywne obejścia, takie jak s///e
, ale nie są one określone przez POSIX. Wolę używać przenośnego formularza, który pokazano powyżej.
W przypadku g
polecenia na końcu musi znajdować się nowa linia i wolę używać printf
zawijania poleceń zamiast osadzania nowej linii w pojedynczych cudzysłowach.
awk
separatora pól!