So erhalten Sie die erste Zeile einer Eingabetextdatei, während Sie diese Zeile aus der Textdatei löschen


11

Wie kann ich die erste Zeile einer Eingabetextdatei abrufen, während ich diese Zeile aus der Textdatei lösche?

Wenn ich eine solche Textdatei /myPathToTheFile.txthätte

► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Ich möchte diese Zeile als Ausgabe erhalten

► put returns between paragraphs

und meine Textdatei sollte jetzt so sein

► for linebreak add 2 spaces at end
► _italic_ or **bold*

Beachten Sie, dass die Kosten für diesen Vorgang proportional zur Dateigröße sind. Wenn die Datei also groß ist und Sie dies häufig tun, ist sie sehr langsam.
CodesInChaos

Antworten:


13
ex -s /myPathToTheFile.txt <<\EX
1p
1d
wq
EX

oder

ex -s /myPathToTheFile.txt <<< 1p$'\n'1d$'\n'wq

oder weniger tippen:

ed -s /myPathToTheFile.txt <<< $'1\nd\nwq'

Wow, nette Verwendung von ed ...!
qwr

10

Zumindest mit GNU sed:

$ cat file
► put returns between paragraphs
► for linebreak add 2 spaces at end
► _italic_ or **bold**

$ sed -i '1{
w /dev/stdout
d}' file
► put returns between paragraphs

$ cat file
► for linebreak add 2 spaces at end
► _italic_ or **bold**

Mit GNU sed kann es als Einzeiler geschrieben werden

sed -i -e '1 {w /dev/stdout' -e 'd}' file

6

Angenommen, Sie fragen nach einem Shell-Skript, dann wird dies das tun, was Sie angefordert haben:

NAME=$1
head -n 1 $NAME
sed -i '1d' $NAME


2

Sie können verwendet werden head, tailund mv:

Zeigen Sie die erste Zeile an:

head -1 myPathToTheFile.txt

Die letzten ( +2) Zeilen behalten:

tail -n +2 myPathToTheFile.txt > file.tmp && mv file.tmp myPathToTheFile.txt

1

Verwenden von Dateideskriptoren und ein wenig von python

{
    { 
    head -n1 >&3; 
    3>&- tail -n +1;
    3>&- python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())';
    }<file 1<>file
} 3>&1

1

Mit Kopf und Schwanz. Die Datei ist target.txt

head -1 target.txt && tail -n+2 target.txt > tmp
mv tmp target.txt && rm tmp

Hinweis: Stellen Sie sicher, dass im aktuellen Ordner keine Datei tmp vorhanden ist. Andernfalls wird sie entfernt.

Erläuterung:

  • "head -1" wählt die erste Zeile aus
  • "tail -n + 2 target.txt> tmp" wählt alle Zeilen ab dem 2. (einschließlich) aus und fügt sie in tmp ein
  • mv überschreibt die Originaldatei mit tmp
  • rm tmp entfernt die so erstellte tmp-Datei
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.