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.