2012-03-13 8 views
9

używam bardzo prosty sed skryptu usuwania komentarzy: sed -e 's/--.*$//'Czy. naprawdę pasuje do dowolnej postaci?

działa świetnie, dopóki znaków spoza ASCII są obecne w komentarzu, np .: -- °. Ta linia nie pasuje do wyrażenia regularnego i nie jest zastępowana.

Każdy pomysł, jak uzyskać ., aby naprawdę pasował do dowolnej postaci?


Rozwiązanie:

Od file mówi, że tekst jest ISO8859, LANG zmienna musi być zmieniona przed wywołaniem sed: LANG=iso8859 sed -e 's/--.*//' -

Odpowiedz

2

@ julio-Guerra: Pobiegłem do podobnej sytuacji, starając się usunąć linie jakby folowing (uwaga na znak Æ) :

--MP_/yZa.b._zhqt9OhfqzaÆC

w pliku, używając

sed 's/^--MP_.*$//g' my_file

Kodowanie plik wskazany przez komendę Linux file był

file my_file: ISO-8859 text, with very long lines 
file -b my_file: ISO-8859 text, with very long lines 
file -bi my_file: text/plain; charset=iso-8859-1 

Próbowałem swoje rozwiązanie, z różnych permutacji (mądry!); np

LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file

ale żaden z nich nie działa. Stwierdzono, że dwie obejścia:

  1. Poniżej Perl ekspresji obrobione, to znaczyusunięte, że linia:

perl -pe 's/^--MP_.*$//g' my_file

[na wyjaśnienie -pe przełączników sterujących linii, odnoszą się do tego StackOverflow odpowiedzi:

Perl flags -pe, -pi, -p, -w, -d, -i, -t?]

  1. Alternatywnie, po konwersji kodowania pliku na UTF-8, działało wyrażenie sed (znak Æ pozostał, ale był teraz kodowany w UTF8):

iconv -f iso-8859-1 -t utf8 my_file > my_file.utf8

Ponieważ pracuję z dużą (1000) e-maili z różnych kodowań, które przechodzą obróbkę pośrednią (bash skryptów konwersji na UTF-8, nie zawsze działa), do moich celów „rozwiązanie 1 "powyżej będzie prawdopodobnie najsolidniejszym rozwiązaniem.

Uwagi:

  • sed (GNU sed) 4,4
  • Perl v5.26.1 zbudowany dla x86_64-linux-thread-wielo
  • System x86_64
  • Arch Linux
0

dokumentacji Polecenie GNU sed o numerze z wspomina ten efekt (mój nacisk):

To polecenie opróżnia zawartość przestrzeni wzorów. Zwykle jest to takie samo jak 's /.*//', ale jest bardziej wydajne i działa w niepoprawnych wielobajtowych sekwencjach w strumieniu wejściowym. POSIX powoduje, że takie sekwencje są , a nie dopasowane przez ".", więc nie ma przenośnego sposobu na wyczyszczenie buforów sed w środku skryptu w większości lokalnych ustawień wielobajtowych (w tym locale UTF-8).

Wydaje się prawdopodobne, że są uruchomione sed w UTF-8 (lub innego wielobajtową) Ustawienia regionalne. Będziesz chciał ustawić wartość LC_CTYPE (która jest bardziej szczegółowa niż LANG i nie będzie miała wpływu na tłumaczenie komunikatów o błędach. Prawidłowe nazwy ustawień narodowych zwykle wyglądają jak en.iso88591 lub (dla lokalizacji w twoim profilu) fr_FR.iso88591, a nie tylko kodowanie na własną rękę - może być w stanie zobaczyć pełną listę z locale -a

Przykład:

LC_CTYPE=fr_FR.iso88591 sed -e 's/--.*//' 

Alternatywnie, jeśli wiesz, że części nie komentować linii zawierają tylko ASCII, można podzieliła. linii na znaczniku komentarza, wydrukuj pierwszą część i odrzuć resztę:

sed -e 's/--/\n/' -e 'P' -e 'd'