it-swarm.com.de

Wie füge ich am Ende von Zeilen ein Muster mit sed oder awk hinzu?

Hier ist eine Beispieldatei:

somestuff...
all: thing otherthing
some other stuff

Ich möchte der Zeile, die mit all: Beginnt, Folgendes hinzufügen:

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

Das funktioniert bei mir

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

Der erste Teil ist ein zu findendes Muster und der zweite Teil ist die Substitution eines gewöhnlichen Seds mit $ für das Ende einer Zeile.

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

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

Oder Sie können es in eine andere Datei umleiten

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

Dies sollte für Sie arbeiten

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

Mit dem Befehl s (Ersatz) können Sie nach einer Zeile suchen, die einem regulären Ausdruck entspricht. Im obigen Befehl wird & steht für den übereinstimmenden String.

9
izidor

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

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

Erläuterung

  • /patt/ {...} Wenn die Zeile mit dem von patt angegebenen Muster übereinstimmt, führen Sie die in {} Beschriebenen Aktionen aus.
  • In diesem Fall: /^all:/ {$0=$0" anotherthing"} Wenn die Zeile mit ^ Beginnt (dargestellt durch all:), Dann hängen Sie anotherthing an die Zeile an.
  • 1 Als True-Bedingung löst die Standardaktion von awk aus: Gibt die aktuelle Zeile aus (print $0). Dies geschieht immer, sodass entweder die ursprüngliche oder die geänderte Zeile gedruckt wird.

Prüfung

Für Ihre Eingabe wird Folgendes zurückgegeben:

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

Beachten Sie, dass Sie den anzuhängenden Text auch in einer Variablen bereitstellen können:

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

In der Bash:

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

Hier ist eine andere einfache Lösung mit sed.

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

Erläuterung:

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

& repräsentiert die Übereinstimmung (dh die komplette Zeile, die mit 'all' beginnt)

dann ersetze sed das erstere durch das spätere und füge das Wort "anotherthing" hinzu

3
chenchuk

Lösung mit awk:

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

Einfach: Wenn die Zeile mit all beginnt, geben Sie die Zeile plus "nichts" aus, andernfalls geben Sie nur die Zeile aus.

3
Manlio