Mam duży plik tekstowy - plik rejestru systemu Windows - około 5,5 MB i muszę usunąć ciąg „serv b Param”. Otwarcie za pomocą gedit lub nano nie działa. Będzie zużywał 100% czasu procesora przez jakiś nierozsądny długi czas lub po prostu wydrukuje losowe śmieci tekstu. Próbowałem użyć tych poleceń z Linuksa, ponieważ nie mogę użyć drugiego:
sed -i 's|"serv\b\Param"|""|g' ~/Desktop/3.reg
sed -i 's|\"serv\b\Param"|\""|g' ~/Desktop/3.reg
sed -i 's:serv\b\Param:"":g' ~/Desktop/3.reg
sed -i 's:serv\b\Param::g' ~/Desktop/3.reg
sed -i 's:"serv\b\Param":"":g' ~/Desktop/3.reg
Jak dotąd nic nie działa. Co jest nie tak z tymi poleceniami?
"serv\b\Param\"
, czy te cytaty i trzy literalne znaki odwrotnych ukośników w pliku? Albo gdzie dodali, aby reprezentować coś innego?Odpowiedzi:
Podstawowym problemem jest to
\
wprowadza różne sekwencje w wyrażeniach regularnych, więc pasują\
w strumieniu wejściowym musisz użyć\\
tam.Nie jest jasne, czy cudzysłowy są częścią ciągu, który chcesz usunąć: z twojego czwartego przykładu zakładam, że nie, w takim przypadku ten przykład działa, jeśli podwoisz ukośniki:
Nie potrzebujesz podwójnych cudzysłowów w wyszukiwanych lub zastępowanych ciągach, chyba że stanowią one część kryteriów wyszukiwania: pojedyncze cudzysłowy wokół wyrażenia edycji już usuwają wszelkie specjalne znaczenia w odniesieniu do powłoki, więc
sed
widzi dosłowne wyrażenie.źródło
Cięcia muszą zostać usunięte:
W
sed
, pojedynczy ukośnik odwrotny jest zwykle znakiem ucieczki dla czegoś. Na przykład w GNUsed
, ucieczka-b, jak w\b
, jest interpretowane jako granica słowa. Aby zapobiec takiej interpretacji, umieść dwa ukośniki odwrotne w rzędzie, gdzie chcesz dopasować pojedynczy literowy ukośnik odwrotny.Przykład
Na podstawie Twojej próbki (zaktualizowanej zgodnie z komentarzami) zacznijmy od tego pliku:
Zastosowanie powyższego
sed
dowództwo:Wzór został pomyślnie usunięty.
źródło