フォルダ内のすべての.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が答えに表示するよりも良いでしょう。