Mam plik tekstowy, który ma określoną linię coś w rodzaju
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Muszę zastąpić całą powyższą linię
This line is removed by the admin.
Szukanym słowem kluczowym jest TEXT_TO_BE_REPLACED
Muszę do tego napisać skrypt powłoki. Jak mogę to osiągnąć za pomocą sed
?
Odpowiedzi:
Możesz użyć polecenia zmiany, aby zastąpić całą linię, oraz
-i
flagi, aby wprowadzić zmiany w miejscu. Na przykład, używając GNU sed:źródło
c\
gdy bezpośrednio po nim następuje zmienna:…c\$VAR…
ukośnik odwróci się od dolara. W tym przypadku (bash / sed na Ubuntu 15.10) miał napisać…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
; (gdy pierwszy parametr jest pusty, edytuje się w pliku, w przeciwnym razie tworzy kopię zapasową).*
Aby zastąpić całą linię, musisz użyć symboli wieloznacznych ( ) przed i po:źródło
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
opcjęPrzyjęta odpowiedź nie działała dla mnie z kilku powodów:
-i
rozszerzenia o zerowej długościc\
polecenia jest dziwna i nie mogłem go uruchomićOto wymyślone przeze mnie rozwiązanie, które moim zdaniem powinno działać w większości przypadków:
Przykładowe użycie do rozwiązania postawionego problemu:
źródło
Odpowiedź powyżej:
Działa dobrze, jeśli zastępujący ciąg / linia nie jest zmienną.
Problem polega na tym, że w Redhat 5
\
poc
ucieczce$
. Podwójny\\
też nie działał (przynajmniej na Redhat 5).Dzięki testom trafień i próbom odkryłem, że ciąg
\
poc
jest zbędny, jeśli zastępujący ciąg / linia jest tylko jedną linią. Więc nie użyłem\
poc
, użyłem zmiennej jako pojedynczej linii zastępczej i to była radość.Kod wyglądałby mniej więcej tak:
Zwróć uwagę na użycie podwójnych cudzysłowów zamiast pojedynczych cudzysłowów.
źródło
Wszystkie dotychczasowe odpowiedzi zakładają, że wiesz coś o tekście, który ma zostać zastąpiony, co ma sens, ponieważ o to poprosił OP. Podaję odpowiedź, która zakłada, że nic nie wiesz o tekście, który ma zostać zastąpiony, i że w pliku może znajdować się osobna linia z taką samą lub podobną treścią, której nie chcesz zastępować. Ponadto zakładam, że znasz numer linii, która ma zostać zastąpiona.
Poniższe przykłady pokazują usuwanie lub zmianę tekstu według określonych numerów linii:
źródło
do manipulowania plikami konfiguracyjnymi
wpadłem na to rozwiązanie zainspirowane odpowiedzią Skensell
configLine [searchPattern] [replaceLine] [filePath]
to będzie:
Funkcjonować:
szalona magia statusu wyjścia pochodzi z https://stackoverflow.com/a/12145797/1262663
źródło
to działa dobrze
źródło
W moim makefile używam tego:
PS: NIE zapominaj, że -i zmienia tak naprawdę tekst w pliku ... więc jeśli wzorzec zdefiniowany jako „Rewizja” ulegnie zmianie, zmienisz również wzorzec, który chcesz zastąpić.
Przykładowe dane wyjściowe:
Więc jeśli ustawisz wzorzec „Wersja: 1190”, to oczywiście nie będzie to samo, co zdefiniowałeś jako „Wersja:” tylko ...
źródło
plik find_replace zawiera 2 kolumny, c1 z dopasowanym wzorcem, c2 z zamiennikiem, pętla sed zastępuje każdą linię zawierającą jeden ze wzorca zmiennej 1
źródło
sed
raz z plikiem skryptu zawierającym wszystkie zamienniki, które chcesz wykonać. Uruchomionysed -i
na tym samym pliku wielokrotnie to straszne antywzorzec projektowy.Jest podobny do powyższego ..
źródło
FOO=TEXT_TO_BE_REPLACED
sięFOO=This line ...
tak nie spełnia specyfikacji.Poniższe polecenie działa dla mnie. Który działa ze zmiennymi
źródło
I bardzo często korzystają z regex danych ekstrakt z plików używanych że po prostu zastąpić dosłownego cytatu
\"
z//
niczego :-)źródło