Ersetzen Sie das n-te Vorkommen einer Zeichenfolge in jeder Zeile einer Textdatei

15

Ich habe große Textdateien mit durch Leerzeichen getrennten Zeichenfolgen (2-5). Die Zeichenfolgen können "'" oder "-" enthalten. Ich möchte beispielsweise das zweite Leerzeichen durch ein Rohr ersetzen.

Was ist der beste Weg?

Mit sed dachte ich darüber nach:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Irgendwelche anderen / besseren / einfacheren Ideen?

dnkb
quelle

Antworten:

21

Sie können am Ende des Ersatzbefehls eine Nummer hinzufügen. Im Folgenden wird beispielsweise das zweite Vorkommen von olddurch die Zeichenfolge newin jeder Zeile von ersetzt file:

sed 's/old/new/2' file

Anstelle Ihrer vorgeschlagenen Lösung können Sie also Folgendes verwenden:

sed 's/ /|/2'

Weitere Informationen finden Sie beispielsweise in diesem sed-Tutorial .

mrucci
quelle
2
Aus der sedInfo-Datei: "Hinweis: Der POSIX-Standard legt nicht fest, was passieren soll, wenn Sie die g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across sed-Implementierungen mischen . Für GNU-sed wird die Interaktion wie folgt definiert: Übereinstimmungen vor der NUMMER ignorieren und dann alle übereinstimmen und ersetzen Spiele ab der Nummer. "
Bis auf weiteres angehalten.
Info-Dateien ... Ich hasse sie. Wie auch immer, ich habe den mehrdeutigen Teil entfernt. Guter Kommentar, +1.
Mrucci
1
Danke, Mrucci und Dennis. Ich dachte, dass es da draußen etwas Einfaches geben muss.
dnkb
Es scheint, dass ich jedes Problem, das ich mit der Textmanipulation habe, lösen kann sed. Ich bin mir nicht sicher, ob ich Ihnen dafür danken soll, dass Sie sedmich noch nützlicher gemacht haben, aber ich werde es trotzdem tun. ;)
Jamie
1

Hast du deine Version ausprobiert? Hat es funktioniert? Weil ich denke, dass es im Grunde eine gute Idee ist. Ich würde es allerdings etwas anders machen:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Dies akzeptiert alle Zeichen in einem Wort, das kein Leerzeichen ist, und akzeptiert mehr als ein Leerzeichen zwischen den ersten beiden Wörtern.

petersohn
quelle