Bashで、ファイルの各行の後に文字列を追加するにはどうすればよいですか?


112

bashを使用してファイルの各行の後に文字列を追加するにはどうすればよいですか?sedコマンドを使用して実行できますか?

回答:


188

パラメータsedを使用してその場で編集できる場合-i

sed -e 's/$/string after each line/' -i filename

そうでない場合は、一時ファイルを作成する必要があります。

typeset TMP_FILE=$( mktemp )

touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename

なぜtouch一時ファイルなのですか?そして、私はそのsedコマンドの成功を条件としてコマンドを作成しcpます。そうしないと、オリジナルが失われる可能性があります。
追って通知があるまで一時停止。

一時的な名前をすぐに予約するためにファイルに触れました。これは必要ないかもしれません。私はあなたがsedコマンドをcpの成功を条件とすることについて正しいと思います。コードを編集して修正してください。少しでも構いません!Yours、Tom
Tom DeGisi

行の前に文字列を追加するのはどうですか?
Oxwivi 2012年

10
@Oxwivi:sed -e 's/^/string after each line/' -i filename $は行末を意味します。^は行頭を意味します。
Tom DeGisi

sedにパイプしている場合、sed 's/^/string after each line/'期待どおりの動作をします(各行の先頭に追加します)が、実行sed 's/^/string after each line/'しません(行全体を追加文字列で置き換えます)。何ができますか?@TomDeGisi?
フィラダムス2013

17

私は使用することを好みawkます。列が1つしかない場合は、を使用します$0。それ以外の場合は、最後の列に置き換えます。

一方通行、

awk '{print $0, "string to append after each line"}' file > new_file

またはこれ、

awk '$0=$0"string to append after each line"' file > new_file

1
また、(私の場合にあったように)行番号を追加するために、一つは使用することができNR、変数を:awk '{print $0, NR}'
andrybak

2
@optimus私はあなたの方法を試しましたが、それらを取り除くための余分なスペースを取得しています、それらを削除する方法についてのアイデアはありますか?
Adil Saju

@AdilSaju sed 's/ //g'これは私の要件にはうまくいきましたが、すべての行のスペースを削除しますg
Eklavyaa

@AdilSajuに詳細を追加してください。新しい質問をする方がいい。
Optimus Prime

@AdilSaju awk , likeを削除し{print $0"string to append after each line"}ます。
Culip

8

あなたがそれを持っているなら、lam(ラミネート)ユーティリティはそれを行うことができます、例えば:

$ lam filename -s "string after each line"

4
  1. 純粋なPOSIXシェルsponge

    suffix=foobar
    while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file | 
    sponge file
  2. xargsprintf

    suffix=foobar
    xargs -L 1 printf "%s${suffix}\n" < file | sponge file
  3. 使用join

    suffix=foobar
    join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
  4. シェルツール使用してpasteyesheadwc

    suffix=foobar
    paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file

    の前にタブ文字がpaste挿入されることに注意してください。$suffix

もちろんsponge、一時ファイルで置き換えることができます。その後mv、他のいくつかの回答と同様に、元のファイル名を上書きします...


1
sedリソースが非常に限られている場合を除いて、これらはどれもに適していません。
agc

私は非sedソリューションが好きです。sedそのような単純な仕事には必要ありません。
ブルース、

1

私は好むecho。純粋なbashを使用する:

cat file | while read line; do echo ${line}$string; done

-9

セドは少し醜いです、あなたはそうエレガントにそれをすることができます:

hendry@i7 tmp$ cat foo 
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar

2
シェルの最大引数制限を超える行数のファイルは失敗します。試してください:猫foo | 読みながら; $ {a} barをエコーし​​ます。完了したか、代わりにそのようなもの。ほとんどの場合、の代わりに使用できます。
アレックス

1
スペースが含まれている行の場合も失敗します。
追って通知があるまで一時停止。

1
ええ、それはデニスを失敗させません。シェルの最大引数制限?危機に瀕しているあなた。
10

はい、そうです:$ cat foo foo bar baz alex @ armitage:〜$ for i in cat foo; $ {i} barをエコーし​​ます。foob​​ar barbar bazbarを終了しましたが、いくつかのテストの後、私は私の推論について間違っているかもしれませんが、デニスは正しいです
アレックス

3
はい@hendry、これは、次のような、その中にスペースを含む行で失敗ないecho "foo bar" | (for i in `cat`; do echo ${i}bar; done)入力が1行であっても2行を印刷しているfoo bar(およびcatファイルの代わりに標準入力から読み取り、このための違いはありません)。
hyde
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.