it-swarm.com.de

Wie füge ich einen Text am Anfang einer Datei ein?

Bisher konnte ich feststellen, wie eine Zeile am Anfang einer Datei eingefügt wird, aber das ist nicht genau das, was ich will. Ich werde es an einem Beispiel zeigen

Dateiinhalt

some text at the beginning

Ergebnis

<added text> some text at the beginning

Es ist ähnlich, aber ich möchte keine neue Zeile damit erstellen ...

Ich möchte dies wenn möglich mit sed machen.

164
user219882

sed kann eine Adresse bearbeiten:

$ sed -i '1s/^/<added text> /' file

Was ist das für ein magischer 1s, den Sie hier auf jeder Antwort sehen? Zeilenadressierung! .

Möchten Sie <added text> in den ersten 10 Zeilen hinzufügen?

$ sed -i '1,10s/^/<added text> /' file

Oder Sie können Command Grouping verwenden:

$ { echo -n '<added text> '; cat file; } >file.new
$ mv file{.new,}
251
kev

Wenn die Datei nur eine Zeile enthält, können Sie Folgendes verwenden:

sed 's/^/insert this /' oldfile > newfile

Wenn es mehr als eine Zeile ist. einer von:

sed '1s/^/insert this /' oldfile > newfile
sed '1,1s/^/insert this /' oldfile > newfile

Ich habe die letztere eingefügt, damit Sie wissen, wie man Linienreihen ausführt. Beide "ersetzen" die Startlinienmarkierung in den betroffenen Zeilen durch den Text, den Sie einfügen möchten. Sie können auch (vorausgesetzt Ihr sed ist modern genug) verwenden:

sed -i 'whatever command you choose' filename

in-Place-Bearbeitung.

26
paxdiablo

Wenn Sie am Anfang einer Datei eine Zeile hinzufügen möchten, müssen Sie am Ende der Zeichenfolge \n in der besten Lösung oben einfügen. 

Die beste Lösung fügt den String hinzu, aber mit dem String wird keine Zeile am Ende einer Datei hinzugefügt.

sed -i '1s/^/your text\n/' file
24
Ali Reza Ebadat

Sie können cat - verwenden

printf '%s' "some text at the beginning" | cat - filename
9
Lex

Um nur eine neue Zeile einzufügen:

sed '1i\\'
8
user4427511

Beachten Sie, dass unter OS X sed -i <pattern> file fehlschlägt. Wenn Sie jedoch eine Sicherungserweiterung sed -i old <pattern> file angeben, wird file an Ort und Stelle geändert, während file.old erstellt wird. Sie können dann file.old in Ihrem Skript löschen.

5
Curt Clifton

PROBLEM: kennzeichnet eine Datei oben in der Datei mit dem Basisnamen des übergeordneten Verzeichnisses.

Das heißt für

/mnt/Vancouver/Programming/file1

kennzeichnen Sie den Anfang von file1 mit Programming.

LÖSUNG 1 - nicht leere Dateien:

bn=${PWD##*/}    ## bn: basename

sed -i '1s/^/'"$bn"'\n/' <file>

1s setzt den Text in Zeile 1 der Datei.

LÖSUNG 2 - leere oder nicht leere Dateien:

Der Befehl sed oben schlägt mit leeren Dateien fehl. Hier ist eine Lösung, basierend auf https://superuser.com/questions/246837/wie-do-i-add-text-to-the-beginner-of-a-einer-datei-in-bash/246841#246841

printf "${PWD##*/}\n" | cat - <file> > temp && mv -f temp <file>

Beachten Sie, dass der Befehl - im Befehl cat erforderlich ist (liest die Standardeingabe: Weitere Informationen finden Sie unter man cat). Ich glaube, es ist notwendig, die Ausgabe der printf -Anweisung (in STDIN) zu übernehmen, und die Datei und die Datei in temp ... Siehe auch die Erklärung am Ende von http://www.linfo.org /cat.html .

Ich fügte auch -f zum Befehl mv hinzu, um zu vermeiden, dass beim Überschreiben von Dateien nach Bestätigungen gefragt wird.

Um über ein Verzeichnis zu rekursieren:

for file in *; do printf "${PWD##*/}\n" | cat - $file > temp && mv -f temp $file; done

Beachten Sie auch, dass Pfade mit Leerzeichen durchbrochen werden. Es gibt Lösungen an anderer Stelle (z. B. Dateiblobbing oder Lösungen mit find . -type f ...-Typ) für diese.

ADDENDUM: Re: Mein letzter Kommentar, dieses Skript ermöglicht es Ihnen, Verzeichnisse mit Leerzeichen in den Pfaden erneut aufzurufen:

#!/bin/bash

## https://stackoverflow.com/questions/4638874/how-to-loop-through-a-directory-recursively-to-delete-files-with-certain-extensi

## To allow spaces in filenames,
##   at the top of the script include: IFS=$'\n'; set -f
##   at the end of the script include: unset IFS; set +f

IFS=$'\n'; set -f

# ----------------------------------------------------------------------------
# SET PATHS:

IN="/mnt/Vancouver/Programming/data/claws-test/corpus test/"

# https://superuser.com/questions/716001/how-can-i-get-files-with-numeric-names-using-ls-command

# FILES=$(find $IN -type f -regex ".*/[0-9]*")        ## recursive; numeric filenames only
FILES=$(find $IN -type f -regex ".*/[0-9 ]*")         ## recursive; numeric filenames only (may include spaces)

# echo '$FILES:'                                      ## single-quoted, (literally) prints: $FILES:
# echo "$FILES"                                       ## double-quoted, prints path/, filename (one per line)

# ----------------------------------------------------------------------------
# MAIN LOOP:

for f in $FILES
do

  # Tag top of file with basename of current dir:
  printf "[top] Tag: ${PWD##*/}\n\n" | cat - $f > temp && mv -f temp $f

  # Tag bottom of file with basename of current dir:
  printf "\n[bottom] Tag: ${PWD##*/}\n" >> $f
done

unset IFS; set +f
3
Victoria Stuart

Hallo mit Wagenrücklauf:

sed -i '1s/^/your text\n/' file
2
xck

Es gibt einen sehr einfachen Weg: 

echo "your header" > headerFile.txt
cat yourFile >> headerFile.txt
2

Zum Spaß dient hier eine Lösung mit ed, bei der das Problem nicht besteht, dass eine leere Datei nicht bearbeitet wird. Sie können es wie jede andere Antwort auf diese Frage in ein Shell-Skript einfügen. 

ed Test <<EOF
a

.
0i
<added text>
.
1,+1 j
$ g/^$/d
wq
EOF

Das obige Skript fügt den einzufügenden Text der ersten Zeile hinzu und fügt dann die erste und zweite Zeile hinzu. Um zu vermeiden, dass ein Fehler mit einem ungültigen Join beendet wird, erstellt er zuerst eine leere Zeile am Ende der Datei und entfernt sie später, falls sie noch existiert.

Einschränkungen: Dieses Skript funktioniert nicht, wenn <added text> genau einer Periode entspricht.

1
merlin2011
echo -n "text to insert " ;tac filename.txt| tac > newfilename.txt

Die erste tac leitet die Datei rückwärts (letzte Zeile zuerst), so dass der "einzufügende Text" zuletzt angezeigt wird. Die 2. Variable tac umgibt sie erneut, sodass die eingefügte Zeile am Anfang steht und die Originaldatei in der ursprünglichen Reihenfolge ist.

1
paulp

meine zwei Cent:

sed  -i '1i /path/of/file.sh' filename

Dies funktioniert auch, wenn die Zeichenfolge den Schrägstrich "/" enthält.

1
vardhan

So fügen Sie eine Zeile am Anfang der Datei hinzu:

sed -i '1iText to add\'
1
solidsnack

Subshell verwenden:

echo "$(echo -n 'hello'; cat filename)" > filename
0
Nick Roz