Wie füge ich am Ende von Zeilen ein Muster hinzu, das ein Muster mit sed oder awk enthält?


88

Hier ist eine Beispieldatei:

somestuff...
all: thing otherthing
some other stuff

Was ich tun möchte, ist, der Zeile, die all:wie folgt beginnt, Folgendes hinzuzufügen :

somestuff...
all: thing otherthing anotherthing
some other stuff

Antworten:


165

Das funktioniert bei mir

sed '/^all:/ s/$/ anotherthing/' file

Der erste Teil ist ein zu findendes Muster und der zweite Teil ist eine gewöhnliche Sed-Substitution, die $das Ende einer Zeile verwendet.

Wenn Sie die Datei während des Vorgangs ändern möchten, verwenden Sie die -iOption

sed -i '/^all:/ s/$/ anotherthing/' file

Oder Sie können es in eine andere Datei umleiten

sed '/^all:/ s/$/ anotherthing/' file > output

Nur etwas hinzuzufügen führt zu einer neuen Zeile, ersetzen ist der richtige Weg.
Zhy

10

Dies sollte für Sie funktionieren

sed -e 's_^all: .*_& anotherthing_'

Mit dem Befehl s (Ersatz) können Sie nach einer Zeile suchen, die einem regulären Ausdruck entspricht. &Steht im obigen Befehl für die übereinstimmende Zeichenfolge.


8

Sie können den Text $0in awk anhängen, wenn er der Bedingung entspricht:

awk '/^all:/ {$0=$0" anotherthing"} 1' file

Erläuterung

  • /patt/ {...}Wenn die Linie mit dem von angegebenen Muster übereinstimmt patt, führen Sie die darin beschriebenen Aktionen aus {}.
  • In diesem Fall: /^all:/ {$0=$0" anotherthing"}Wenn die Zeile mit beginnt (dargestellt durch ^) all:, fügen Sie sie anotherthingan die Zeile an.
  • 1Löst als echte Bedingung die Standardaktion aus awk: Drucken Sie die aktuelle Zeile ( print $0). Dies geschieht immer, sodass entweder die ursprüngliche oder die geänderte Zeile gedruckt wird.

Prüfung

Für Ihre angegebene Eingabe wird Folgendes zurückgegeben:

somestuff...
all: thing otherthing anotherthing
some other stuff

Beachten Sie, dass Sie auch den Text zum Anhängen an eine Variable bereitstellen können:

$ awk -v mytext=" EXTRA TEXT" '/^all:/ {$0=$0mytext} 1' file
somestuff...
all: thing otherthing EXTRA TEXT
some other stuff

Unter Solaris wird folgende Fehlermeldung awk: can't set $0
angezeigt

@ceving dann kannst du verwenden /usr/xpg4/bin/awkwas das "gute" awk ist.
Fedorqui 'SO hör auf zu schaden'

6

In Bash:

while read -r line ; do
    [[ $line == all:* ]] && line+=" anotherthing"
    echo "$line"
done < filename

6

Hier ist eine weitere einfache Lösung mit sed.

$ sed -i 's/all.*/& anotherthing/g' filename.txt

Erläuterung:

all. * bedeutet, dass alle Zeilen mit 'all' beginnen.

& stellen die Übereinstimmung dar (dh die vollständige Zeile, die mit 'all' beginnt)

Ersetzen Sie dann das erstere durch das spätere und fügen Sie das Wort "anderweitig" hinzu


3

Lösung mit awk:

awk '{if ($1 ~ /^all/) print $0, "anotherthing"; else print $0}' file

Einfach: Wenn die Zeile mit dem allDrucken der Zeile plus "etwas anderes" beginnt, drucken Sie nur die Zeile.


4
Sie können das verkürzen auf:awk '$1=="all:" {$(NF+1)="anotherthing"} 1'
Glenn Jackman

2
@Prometheus, ein awk-Skript besteht aus condition {actions}Paaren. Wenn das conditionweggelassen wird, werden die Aktionen für jeden Datensatz ausgeführt. Wenn die {actions}weggelassen werden und die Bedingung als wahr ausgewertet wird (was für die Nummer der Fall ist 1), besteht die Standardaktion darin, den aktuellen Datensatz zu drucken.
Glenn Jackman
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.