it-swarm.com.de

Wie entferne ich leere Zeilen vom Anfang und Ende der Datei?

Ich möchte leere Zeilen vom Anfang und Ende der Datei entfernen, aber keine leeren Zeilen zwischen den Zeilen entfernen. Ich denke, sed oder awk wäre die Lösung.

Quelle:

1:
2:
3:line1
4:
5:line2
6:
7:
8:

Ausgabe:

1:line1
2:
3:line2
10
Feriman

Versuche dies,

So entfernen Sie Leerzeilen am Anfang einer Datei:

sed -i '/./,$!d' filename

So entfernen Sie Leerzeilen am Ende einer Datei:

sed -i -e :a -e '/^\n*$/{$d;N;ba' -e '}' file

So entfernen Sie Leerzeilen vom Anfang und Ende einer Datei:

sed -i -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba' -e '}' file

Vom Menschen sed,

-e Skript, --expression = Skript -> Fügen Sie das Skript zu den auszuführenden Befehlen hinzu

b label -> Branch to label; Wenn die Bezeichnung weggelassen wird, verzweigen Sie zum Ende des Skripts.

a -> Text nach einer Zeile anhängen (alternative Syntax).

$ -> Entspricht der letzten Zeile.

n N -> Fügen Sie dem Musterbereich eine neue Zeile hinzu und hängen Sie dann die nächste Eingabezeile an den Musterbereich an. Wenn keine Eingabe mehr erfolgt, wird sed beendet, ohne dass weitere Befehle verarbeitet werden.

5
Stack EG

Dieses kleine awk-Programm entfernt leere Zeilen beim Start einer Datei:

awk 'NF {p=1} p'

Also können wir das mit tac kombinieren, das Linien umkehrt und erhält:

awk 'NF {p=1} p' file | tac | awk 'NF {p=1} p' | tac
line1

line2

Stehlen @ guillermo chamorro's Befehlsersetzungstrick:

awk 'NF {p=1} p' <<< "$(< file)"
7
glenn jackman

Ich schlage vor:

printf '%s\n' "$(cat file)" | sed '/[a-z]/,$!d'

Es wird der gesamte Text mit Ausnahme der Leerzeilen am Anfang und am Ende gedruckt. Wenn wir also das Beispiel erweitern:

(blank)
(blank)
line1

line2
line1

line2
line1

line2
line1



line2
(blank)
(blank)

Es wird ausgegeben:

line1

line2
line1

line2
line1

line2
line1




line2
5

Wenn die Datei klein genug ist, um den Speicheranforderungen zu entsprechen:

$ Perl -0777 -pe 's/^\n+|\n\K\n+$//g' ip.txt
line1

line2
  • -0777 um die gesamte Eingabedatei zu schlürfen
  • ^\n+ eine oder mehrere Zeilenumbrüche vom Anfang der Zeichenfolge
  • \n\K um zu verhindern, dass das Zeilenumbruchzeichen der letzten nicht leeren Zeile gelöscht wird
  • \n+$ eine oder mehrere Zeilenumbrüche am Ende der Zeichenfolge
5
Sundeep

Ein einfacher 2-Pass-Ansatz nur der Vollständigkeit halber:

$ awk 'NR==FNR{if (NF) { if (!beg) beg=NR; end=NR } next} FNR>=beg && FNR<=end' file file
line1

line2

Das obige behandelt nur Zeilen mit leeren Zeichen als leer. Wenn Sie stattdessen nur Zeilen ohne Zeichen als leer betrachten möchten, ändern Sie einfach NF in /./.

1
Ed Morton

Der Code wurde nicht geschrieben, aber es muss einen effizienten Algorithmus für Dateien jeder Größe in dieser Richtung geben.

(a) Lesen und ignorieren Sie leere Zeilen, bis die erste nicht leer ist.

(b) Lesen und drucken Sie nicht leere Zeilen bis zur nächsten leeren.

(c) Zähle (n) die leeren Zeilen bis zur nächsten nicht leeren.

(d) Wenn Sie nicht leer drücken, drucken Sie n Zeilenumbrüche und Sie befinden sich wieder im Status (b).

(e) Wenn Sie EOF drücken, sind Sie fertig - n leere Zeilen vor EOF verworfen.

0
Paul_Pedant