Mam duży plik, który zawiera znaki specjalne. Jest tam kod wieloliniowy, który chcę zastąpić sed
.
To:
text = "\
------ ------\n\n\
This message was automatically generated by email software\n\
The delivery of your message has not been affected.\n\n\
------ ------\n\n"
Musi zmienić się w to:
text = ""
Próbowałem następującego kodu, ale bez powodzenia:
sed -i '/ text = "*/ {N; s/ text = .*affected.\./ text = ""/g}' /etc/exim.conf
Niczego nie zastępuje i nie wyświetla żadnych komunikatów o błędach
Bawiłem się tym, ale wszystko, co próbuję, nie działa.
text-processing
sed
perl
blade19899
źródło
źródło
sed
czy jesteś otwarty na inne narzędzia? Czy może być"
wtext=
bloku? Czytext =
w twoim pliku mogą znajdować się inne przypadki ? Czy zawsze będą 4 wiersze tekstu, czy może być więcej / mniej?sed
lub cokolwiek, co nie wymaga instalacji na serwerze CentOS.text =
w folderze, musi być wyjścietext = ""
. Pliki zawierają 891 linii kodu. SO, musi respektować drugi tekst.text = ""
. Jak widać w moim pytaniu.Odpowiedzi:
Perl na ratunek:
-i~
edytuje plik „na miejscu”, pozostawiając kopię zapasową-0777
czyta cały plik na raz, nie wiersz po wierszuPodstawienie
s///
działa podobnie jak w sed (tzn. Dopasowuje,text = "
po którym następuje wielokrotność cudzysłowu wiele razy aż do podwójnego cudzysłowu), ale w tym przypadku działa na całym pliku.źródło
Musisz sprawdzić przestrzeń wzoru i ciągnąć
N
linię zewnętrzną, jeśli nie pasuje ona npz
gnu sed
możesz napisać to jakoNie jest to jednak zbyt wydajne, lepiej po prostu wybierz zakres
/text = "/,/"/
, zmodyfikuj pierwszy wiersz i usuń resztę:jeszcze raz,
gnu sed
możesz napisać to jako jedno-linijkę:źródło
Osobiście zrobiłbym to w Perlu. Jeśli możemy założyć, że nie ma
"
przed zamknięciem"
, możesz zrobić:-0
Slurps całego pliku, czytając ją w pamięci. Te-p
środki „wydrukować każdą linię (tutaj jest«linia»będzie cały plik) po zastosowaniu skryptu podane przez-e
”. Sam skrypt jest prostym operatorem podstawiania. Przechwyci ciąg,text
po którym następuje 0 lub więcej białych znaków,=
i ponownie 0 i więcej białych znaków (text\s*=\s*
) i zapisze go jako$1
. Następnie zastąpi przechwycony wzorzec, a także najkrótszy cytowany ciąg znaleziony wzorcem ($1
) i""
.s
Flag sprawia.
newlines meczu.źródło
-00
czyta w punktach, a nie cały plik ( ref ). Jeśli tekst w cudzysłowie zawiera pusty wiersz, wyrażenie regularne nie będzie pasować.perl -00ne 'print;exit'
. I wciąż podaję niewłaściwy w swojej odpowiedzi! Dzięki, naprawione teraz.