Entfernen Sie leere Zeilen in einer Textdatei über grep


Antworten:


128

grep . FILE


(Und wenn Sie es wirklich in sed machen wollen, dann: sed -e /^$/d FILE )

(Und wenn Sie es wirklich in awk tun wollen, dann: awk /./ FILE)


1
Süss! TY auch für die anderen Befehle - aber es sieht so aus, als wäre grep mein neuer bester Freund.
user191960

grep. DATEI funktioniert bei mir nicht. Es ist wahrscheinlich besser, bei grep zu bleiben, um nach Dateiinhalten zu suchen, und sed, um Dateiinhalte zu bearbeiten.
Michael Dillon

7
sed -ne/./pfunktioniert auch und awk /./ist kürzer (Aktion ist, {print}wenn nicht angegeben). @ Ghostdog74: grep '[^[:space:]]'dann.
Ephemient

5
Für diejenigen, die nicht verstehen, .ist der ein regulärer Ausdruck, der mit jedem Zeichen außer Newline übereinstimmt.
wisbucky

3
grep . FILEfunktioniert mit dem angegebenen Beispiel, aber nicht unbedingt, wenn die Datei Bytes enthalten kann, die nicht Teil des Zeichensatzes sind. Zum Beispiel gibt mit GNU grep 2.20 printf "\x80\n" | grep .nichts aus.
vinc17

37

Versuche Folgendes:

grep -v -e '^$'

Dies hat den gleichen Effekt wie grep. DATEI darin, dass ein Leerzeichen als leere Zeile erfasst wird.
Ghostdog74

1
"grep" sucht nach einer Linie, die dem Muster entspricht. "." passt zu einem beliebigen Zeichen. "grep. FILE" entspricht einer Zeile mit mindestens 1 Zeichen. Während "grep -v" Linien ausschließt, die dem Muster entsprechen. OP sagte "entferne alle leeren neuen Zeilen". Wenn Sie Zeilen mit nur Leerzeichen ausschließen möchten, "grep -v '^ $'". Das " " entspricht null oder mehr des vorhergehenden Musters, in diesem Fall einem Leerzeichen. Möglicherweise möchten Sie jedoch auch andere Leerzeichen (Registerkarten, Formular-Feeds usw.) abgleichen und ausschließen.
Mr.Ree

3
Mit dieser Methode konnte ich mehrere Ausschlüsse einfacher kombinieren als nur "grep. FILE". Zum Beispiel habe ich mir eine conf-Datei angesehen und wollte alle kommentierten Zeilen und alle leeren Zeilen ausschließen. Also habe ich "grep -v -e '#' -e '^ $' squid.conf" verwendet. Arbeitete eine Belohnung.
Ben K

2
Dieser ist viel schneller als der Grep. DATEI'. Dies liegt an den komplexeren Aufgaben der Überprüfung des regulären Ausdrucks '.' als ausschließen, sobald ^ $ nicht übereinstimmt.
Édouard Lopez

2
grep -v -e '^$'funktioniert immer, was bei nicht der Fall ist grep .. Beispielsweise gibt mit GNU grep 2.20 printf "\x80\n" | grep .nichts aus, während printf "\x80\n" | grep -v '^$'die nicht leere Zeile ausgegeben wird.
vinc17

11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar

Benötigt keine Anführungszeichen. Dieser Trick findet sich in awk1line.txt- aber auch die meisten
Awk-

2
Es ist nur meine gute Praxis, Anführungszeichen zu setzen, da Sie es von der Shell aus ausführen. Für zusammengesetzte awk-Anweisungen müssen Sie immer noch Anführungszeichen setzen. Warum also nicht diese Gewohnheit pflegen?
Ghostdog74

Erklärung, wie das funktioniert: stackoverflow.com/questions/23544804/…
wisbucky

9

Hier ist eine Lösung, die alle Zeilen entfernt, die entweder leer sind oder nur Leerzeichen enthalten:

grep -v '^[[:space:]]*$' foo.txt

2

Versuche dies: sed -i '/^[ \t]*$/d' file-name

Es werden alle Leerzeilen mit der Nr. Löscht. von Leerzeichen (Leerzeichen oder Tabulatoren), dh (0 oder mehr) in der Datei.

Hinweis: In der eckigen Klammer befindet sich ein Leerzeichen gefolgt von '\ t'.

Der Modifikator -ierzwingt das Zurückschreiben des aktualisierten Inhalts in die Datei. Ohne dieses Flag können Sie sehen, dass die leeren Zeilen auf dem Bildschirm gelöscht wurden, die eigentliche Datei jedoch nicht betroffen ist.


1

grep '^..' my_file

Beispiel

THIS

IS

THE

FILE

EOF_MYFILE

Es werden nur Zeilen mit mindestens 2 Zeichen ausgegeben.

THIS
IS
THE
FILE
EOF_MYFILE

Siehe auch die Ergebnisse mit grep '^' my_fileAusgängen

THIS

IS

THE

FILE

EOF_MYFILE

und auch mit grep '^.' my_fileAusgängen

THIS
IS
THE
FILE
EOF_MYFILE

1

Wenn das Entfernen leerer Zeilen Zeilen mit Leerzeichen bedeutet, verwenden Sie:

grep '\S' FILE

Zum Beispiel:

$  printf "line1\n\nline2\n \nline3\n\t\nline4\n" > FILE
$  cat -v FILE
line1

line2

line3

line4
$  grep '\S' FILE
line1
line2
line3
line4
$  grep . FILE
line1
line2

line3

line4

Siehe auch:


0

Versuchen Sie es ex -way:

ex -s +'v/\S/d' -cwq test.txt

Für mehrere Dateien (direkt bearbeiten):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Ohne die Datei zu ändern (einfach auf die Standardausgabe drucken):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Perl mag übertrieben sein, aber es funktioniert genauso gut.

Entfernt alle Zeilen, die vollständig leer sind:

perl -ne 'print if /./' file

Entfernt alle Zeilen, die vollständig leer sind oder nur Leerzeichen enthalten:

perl -ne 'print if ! /^\s*$/' file

Variation, die das Original bearbeitet und eine .bak-Datei erstellt:

perl -i.bak -ne 'print if ! /^\s*$/' file

0

Wenn Sie wissen möchten, wie viele Codezeilen in Ihrem Xcode-Projekt insgesamt enthalten sind und Sie nicht daran interessiert sind, die Anzahl für jede schnelle Datei aufzulisten, erhalten Sie die Antwort. Es werden Zeilen ohne Code entfernt und Zeilen, denen der Kommentar vorangestellt ist//

Führen Sie es auf der Stammebene Ihres Xcode-Projekts aus.

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

Wenn Sie Codeblöcke in Ihrem Code haben, die mit /*und enden mit */:

/*
 This is an comment block 
*/

dann werden diese in die Zählung einbezogen. (Zu schwer).


0

Einfachste Antwort -------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.