フォルダ内のすべてのファイルにテキストを追加 [重複]

フォルダ内のすべてのファイルにテキストを追加 [重複]

フォルダ内のすべての.mファイルの前にdisclaimer.txtファイルに含まれるテキストを追加したいと思います。

私は以下を試しました:

text=$(cat ./disclaimer.txt)

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

しかし、前に空白行が追加されます。

答え1

これを行うにはいくつかの方法がありますが、最初に試すことができる簡単な方法は次のとおりです。

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

免責事項と元のファイルを新しい一時ファイルにリンクし、元のファイルを一時ファイルの内容に置き換えます。

答え2

これには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が答えに表示するよりも良いでしょう。

関連情報