użyj sed do zastąpienia określonego ciągu ukośnikami

1

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?

user128712
źródło
W "serv\b\Param\", czy te cytaty i trzy literalne znaki odwrotnych ukośników w pliku? Albo gdzie dodali, aby reprezentować coś innego?
John1024
Nie, po prostu serv bam Param i nie ma cytatów.
user128712

Odpowiedzi:

0

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:

sed -i 's:serv\\b\\Param::g' ~/Desktop/3.reg

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.

AFH
źródło
0

Cięcia muszą zostać usunięte:

sed -i 's|serv\\b\\Param\\||g' ~/Desktop/3.reg

W sed, pojedynczy ukośnik odwrotny jest zwykle znakiem ucieczki dla czegoś. Na przykład w GNU sed, 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:

$ cat 3.reg
serv\b\Param\
abc serv\b\Param\ def

Zastosowanie powyższego sed dowództwo:

$ sed -i 's|serv\\b\\Param\\||g' 3.reg
$ cat 3.reg

abc  def

Wzór został pomyślnie usunięty.

John1024
źródło