web-dev-qa-db-ja.com

sedまたはawkのパターンを含む行の最後に追加する方法は?

サンプルファイルを次に示します。

somestuff...
all: thing otherthing
some other stuff

私がやりたいのは、次のようにall:で始まる行に追加することです:

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

これは私のために働く

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

最初の部分は見つけるパターンで、2番目の部分は行末に$を使用した通常のsedの置換です。

プロセス中にファイルを変更する場合は、-iオプションを使用します

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

または、別のファイルにリダイレクトできます

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

これはあなたのために働くはずです

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

Sコマンド(置換)を使用すると、正規表現を満たす行を検索できます。上記のコマンドでは、&は一致した文字列を表します。

9
izidor

条件に一致する場合、awkの$0にテキストを追加できます。

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

説明

  • /patt/ {...}行がpattで指定されたパターンと一致する場合、{}で説明されているアクションを実行します。
  • この場合:/^all:/ {$0=$0" anotherthing"}で始まる行(^で表される)がall:の場合、anotherthingを行に追加します。
  • 1は真の条件として、awkのデフォルトアクションをトリガーします。現在の行を印刷します(print $0)。これは常に発生するため、元の行または変更された行を印刷します。

テスト

与えられた入力に対して、それは以下を返します:

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

変数に追加するテキストを提供することもできます。

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

Bashの場合:

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

Sedを使用した別の簡単なソリューションを次に示します。

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

説明:

all。*は、「all」で始まるすべての行を意味します。

&一致を表します(「all」で始まる完全な行)

次に、sedを前者を後のものに置き換え、「別のもの」という単語を追加します

3
chenchuk

Awkを使用したソリューション:

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

単純に:行がallで始まる場合、行に「anotherthing」を加えて印刷し、そうでない場合は行のみを印刷します。

3
Manlio