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
Yasar
quelle

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
user219882
quelle
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.

Izidor
quelle
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
fedorqui 'SO hör auf zu schaden'
quelle
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
Glenn Jackman
quelle
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

chenchuk
quelle
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.

Manlio
quelle
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