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*
stacko
quelle
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'
Jeff Schaller
quelle
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
Steeldriver
quelle
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
Stephen Rauch
quelle
5
sed -ne '1p' -e '1!s/^//w temp_file' yourfile && mv temp_file yourfile
Rakesh Sharma
quelle
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
GAD3R
quelle
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
iruvar
quelle
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
Valyrian
quelle