@HuStmpHrrr gnu sed w ogóle nie obsługuje PCRE. jest ERE z-r
Kent
8
Potrzebny jest OS X sed -i "" '/^[[:space:]]*$/d'<filename>,
jww
@BernieReiter ^\s*$dopasuje wszystkie „puste” linie, puste tutaj oznacza, linia nie zawiera znaków, lub linia zawiera tylko puste ciągi (np. Spacje). Wszystkie dopasowane linie zostaną usunięte za pomocą dpolecenia sed .
Kent
96
Brakuje mi awkrozwiązania:
awk 'NF' file
Które zwróci:
xxxxxx
yyyyyy
zzzzzz
Jak to działa? Ponieważ NFoznacza „liczbę pól”, puste linie mają 0 fiedlów, dzięki czemu awk ocenia 0 na False i żaden wiersz nie jest drukowany; jednak jeśli jest co najmniej jedno pole, ocena ma wartość Prawda i powoduje awkwykonanie domyślnej akcji: wydrukuj bieżącą linię.
Whoah Działa nawet z „zminimalizowaną” wersją awk BSD (wersja 20121220 (FreeBSD). Dzięki :-)
Bernie Reiter
@BernieReiter jesteś mile widziany :) Tak, jest to bardzo prosta idiomatyczna rzecz, na którą pozwalają wszystkie wersje awk.
fedorqui „SO przestań krzywdzić”
I to jest o wiele szybsze, chociaż - dla szybkiego i brudnego testu - wzywam awk dwa razy: $ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006suser 0m0.000ssys 0m0.008s$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014suser 0m0.002ssys 0m0.006s Czy znasz dobry sposób na włączenie tego do skryptu awk, np. Wzorca? awk '/ mypattern / {do stuff ...}'
Są one poprawnie wyświetlane w narzędziu online, ale nie[] należy ich umieszczać w nawiasach, więc tutaj kod nie jest poprawny dla - \[\[:space:\]\]lub \[ \t\]powinien być [[:space:]]i [ \t].
Benjamin W.,
1
@BenjaminW. Dzięki za złapanie tego. Nie pochodziły one od oryginalnego autora, ale pochodziły z Edit 3, kiedy zmieniono go ze zwykłego tekstu na „kod”, który następnie „odsłonił” ucieczkę `\ '. Naprawiłem je teraz.
wisbucky,
30
Uważam, że jest to najłatwiejszy i najszybszy:
cat file.txt | grep .
Jeśli chcesz zignorować również wszystkie białe znaki, spróbuj tego:
Nie ma potrzeby cat, greppobiera również pliki:grep . file.txt
Ciro Santilli 16 冠状 病 六四 事件 法轮功
3
Tak, wiem, ale początkowe pytanie nie wspomniało, czy źródłem jest plik, czy coś innego, więc rozwiązaniem jest to, co następuje po „|”, a przed nim tylko przykład źródła. Wystarczy odróżnić rozwiązanie od źródła linii.
Vadim
2
grep '\S'zdecydowanie nie jest przenośny. Jeśli masz grep -P, możesz użyć, grep -P '\S'ale nie jest obsługiwany na wszystkich platformach.
tripleee
Minusem w grep .porównaniu z innymi rozwiązaniami jest to, że podświetli cały tekst na czerwono. Inne rozwiązania mogą zachować oryginalne kolory. Porównaj unbuffer apt search foo | grep .zunbuffer apt search foo | grep -v ^$
wisbucky,
15
Z pomocą tutaj zaakceptowanej odpowiedzi i powyższej odpowiedzi wykorzystałem:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Obejmuje wszystkie podstawy i działa idealnie dla moich potrzeb. Uznanie dla oryginalnych plakatów @Kent i @kev
Najprawdopodobniej widzisz nieoczekiwane zachowanie, ponieważ plik tekstowy został utworzony w systemie Windows, więc sekwencja końca linii to \r\n. Możesz użyć dos2unix, aby przekonwertować go do pliku tekstowego w stylu UNIX przed uruchomieniem sed lub użyj
sed -r "/^\r?$/d"
aby usunąć puste linie bez względu na to, czy jest tam znak powrotu karetki.
Cześć, co -rrobi flaga i czy można ją połączyć, -iaby bezpośrednio zmodyfikować plik i uniknąć drukowania na ekranie. Ponadto myślę, że to polecenie również działałoby jakosed -r "/^\r$/d"
Alexander Cska,
2
Inną opcją bez sed, awk, perl, etc
strings $file > $output
strings - drukuje ciągi znaków do wydrukowania w plikach.
Ta odpowiedź ilustruje rozliczenie, czy puste linie mają spacje ( [\ ]*), a także użycie| do oddzielenia wielu wyszukiwanych terminów / pól. Testowane na macOS High Sierra i CentOS 6/7.
FYI, oryginalny kod OP sed '/^$/d' $filedziała dobrze w bashTerminalu na macOS High Sierra i CentOS 6/7 Linux w wysoko wydajnym klastrze superkomputerowym.
Odpowiedzi:
W swoim „pustym” wierszu mogą znajdować się spacje lub tabulatory. Użyj klas POSIX z,
sed
aby usunąć wszystkie wiersze zawierające tylko białe znaki:Krótsza wersja korzystająca z ERE, na przykład z gnu sed:
(Zauważ, że sed NIE obsługuje PCRE.)
źródło
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,^\s*$
dopasuje wszystkie „puste” linie, puste tutaj oznacza, linia nie zawiera znaków, lub linia zawiera tylko puste ciągi (np. Spacje). Wszystkie dopasowane linie zostaną usunięte za pomocąd
polecenia sed .Brakuje mi
awk
rozwiązania:Które zwróci:
Jak to działa? Ponieważ
NF
oznacza „liczbę pól”, puste linie mają 0 fiedlów, dzięki czemu awk ocenia 0 na False i żaden wiersz nie jest drukowany; jednak jeśli jest co najmniej jedno pole, ocena ma wartość Prawda i powodujeawk
wykonanie domyślnej akcji: wydrukuj bieżącą linię.źródło
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
Czy znasz dobry sposób na włączenie tego do skryptu awk, np. Wzorca? awk '/ mypattern / {do stuff ...}'awk 'NF {do stuff...}'
.sed '/^$/d'
powinno być w porządku, czy spodziewasz się zmodyfikować plik na miejscu? Jeśli tak, powinieneś użyć-i
flagi.Może te linie nie są puste, więc jeśli tak jest, spójrz na to pytanie Usuń puste linie z plików txt, usuń spacje od początku i końca linii Wierzę, że to właśnie próbujesz osiągnąć.
źródło
sed -i '/^$/d'
jest jednym ze sposobów na zrobienie tego.sed
'/^[[:space:]]*$/d'
'/^\s*$/d'
'/^$/d'
-n '/^\s*$/!p'
grep
.
-v '^$'
-v '^\s*$'
-v '^[[:space:]]*$'
awk
/./
'NF'
'length'
'/^[ \t]*$/ {next;} {print}'
'!/^[ \t]*$/'
źródło
[]
należy ich umieszczać w nawiasach, więc tutaj kod nie jest poprawny dla -\[\[:space:\]\]
lub\[ \t\]
powinien być[[:space:]]
i[ \t]
.Uważam, że jest to najłatwiejszy i najszybszy:
Jeśli chcesz zignorować również wszystkie białe znaki, spróbuj tego:
Przykład:
wyjścia
źródło
cat
,grep
pobiera również pliki:grep . file.txt
grep '\S'
zdecydowanie nie jest przenośny. Jeśli maszgrep -P
, możesz użyć,grep -P '\S'
ale nie jest obsługiwany na wszystkich platformach.grep .
porównaniu z innymi rozwiązaniami jest to, że podświetli cały tekst na czerwono. Inne rozwiązania mogą zachować oryginalne kolory. Porównajunbuffer apt search foo | grep .
zunbuffer apt search foo | grep -v ^$
Z pomocą tutaj zaakceptowanej odpowiedzi i powyższej odpowiedzi wykorzystałem:
Obejmuje wszystkie podstawy i działa idealnie dla moich potrzeb. Uznanie dla oryginalnych plakatów @Kent i @kev
źródło
Możesz powiedzieć:
źródło
print all lines except the empty one(s)
i bądź cichoMożesz zrobić coś takiego za pomocą „grep”:
źródło
Działa to również w awk.
źródło
Najprawdopodobniej widzisz nieoczekiwane zachowanie, ponieważ plik tekstowy został utworzony w systemie Windows, więc sekwencja końca linii to
\r\n
. Możesz użyć dos2unix, aby przekonwertować go do pliku tekstowego w stylu UNIX przed uruchomieniem sed lub użyjaby usunąć puste linie bez względu na to, czy jest tam znak powrotu karetki.
źródło
-r
robi flaga i czy można ją połączyć,-i
aby bezpośrednio zmodyfikować plik i uniknąć drukowania na ekranie. Ponadto myślę, że to polecenie również działałoby jakosed -r "/^\r$/d"
Inną opcją bez
sed
,awk
,perl
, etcstrings - drukuje ciągi znaków do wydrukowania w plikach.
źródło
strings
zamiaststring
?Moją
bash
specyficzną odpowiedzią jest zalecenie użycia w tym celuperl
operatora podstawienia z globalnąg
flagą wzorca :Ta odpowiedź ilustruje rozliczenie, czy puste linie mają spacje (
[\ ]*
), a także użycie|
do oddzielenia wielu wyszukiwanych terminów / pól. Testowane na macOS High Sierra i CentOS 6/7.FYI, oryginalny kod OP
sed '/^$/d' $file
działa dobrze wbash
Terminalu na macOS High Sierra i CentOS 6/7 Linux w wysoko wydajnym klastrze superkomputerowym.źródło
Dla mnie z FreeBSD 10.1 z sed pracował tylko to rozwiązanie:
wewnątrz
[]
są spacje i symbole tabulatorów.plik testowy zawiera:
źródło