Próbuję usunąć puste linie za pomocą sed:
sed '/^$/d'
ale nie mam z tym szczęścia.
Na przykład mam następujące linie:
xxxxxx
yyyyyy
zzzzzz
i chcę, żeby wyglądało to tak:
xxxxxx
yyyyyy
zzzzzz
Jaki powinien być kod tego?
Próbuję usunąć puste linie za pomocą sed:
sed '/^$/d'
ale nie mam z tym szczęścia.
Na przykład mam następujące linie:
xxxxxx
yyyyyy
zzzzzz
i chcę, żeby wyglądało to tak:
xxxxxx
yyyyyy
zzzzzz
Jaki powinien być kod tego?
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:
sed '/^[[:space:]]*$/d'
Krótsza wersja korzystająca z ERE, na przykład z gnu sed:
sed -r '/^\s*$/d'
(Zauważ, że sed NIE obsługuje PCRE.)
-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:
awk 'NF' file
Które zwróci:
xxxxxx
yyyyyy
zzzzzz
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 powoduje awk
wykonanie domyślnej akcji: wydrukuj bieżącą linię.
$ 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ąć.
sed -i '/^$/d'
jest jednym ze sposobów na zrobienie tego.
[]
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:
cat file.txt | grep .
Jeśli chcesz zignorować również wszystkie białe znaki, spróbuj tego:
cat file.txt | grep '\S'
Przykład:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
wyjścia
7
5
cat
, grep
pobiera również pliki:grep . file.txt
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.
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 ^$
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
Działa to również w awk.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
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.
-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
, etc
strings $file > $output
strings - drukuje ciągi znaków do wydrukowania w plikach.
strings
zamiast string
?
Moją bash
specyficzną odpowiedzią jest zalecenie użycia w tym celu perl
operatora podstawienia z globalną g
flagą wzorca :
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
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 w bash
Terminalu na macOS High Sierra i CentOS 6/7 Linux w wysoko wydajnym klastrze superkomputerowym.
Dla mnie z FreeBSD 10.1 z sed pracował tylko to rozwiązanie:
sed -e '/^[ ]*$/d' "testfile"
wewnątrz []
są spacje i symbole tabulatorów.
plik testowy zawiera:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============