web-dev-qa-db-ja.com

フォルダ内のすべてのファイルにテキストを追加する

フォルダー内のすべての.mファイルに、disclaimer.txtファイルに含まれているテキストを付加したいのですが。

私は以下を試しました:

text=$(cat ./disclaimer.txt)

for f in ./*.m
do
   sed -i '1i $text' $f
done

しかし、それは単に空行を追加します。

3
shamalaia

これを行うには多くの方法がありますが、ここでは簡単な最初のスタブです:

#!/bin/sh
for file in *.m; do
    cat disclaimer.txt $file >> $file.$$
    mv $file.$$ $file
done

免責事項と元のファイルを新しい一時ファイルに連結してから、元のファイルを一時ファイルの内容に置き換えます。

8
mjturner

これには2つの問題があります。

sed -i '1i $text' $f

まず、変数は単一引用符内で展開されないため、sedはリテラル文字列1i $textを参照します。

2番目の問題は、iコマンドが次のバックスラッシュを期待していることであり、その行は2行目に追加されるため、次のようにする必要があります。

$ text="blah"
$ sed -i $'1i\\\n'"$text"$'\n' "$file"

$'...'展開のあるシェル、またはそれをサポートしないシェルのリテラル改行付き)

また、iコマンドは1行しか追加できません。次の行は、追加のsedコマンドと見なされます。

GNU= sedを使用している場合、sed -i "1i $text" "$f"だけで十分ですが、それでも1行しか表示されません。

複数行の場合、@ mjturnerが回答で示したようなものにした方がよいでしょう。

5
ilkkachu