web-dev-qa-db-ja.com

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

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

100
Jason Volkoz

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
162
Tom DeGisi

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
11
Optimus Prime

持っている場合は、 lam (積層)ユーティリティで実行できます。例:

$ lam filename -s "string after each line"
7
martin clayton
  1. 純粋なPOSIX Shellおよび sponge

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

    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. pasteyeshead、およびwcを使用するシェルツール:

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

    pasteは、$suffixの前にTab文字を挿入することに注意してください。

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

3
agc