line 2
ファイルのどこかに特定の文字列を含むすべてのファイルに文字列を挿入したいです。
良い
sed '1 a #This is just a commented line' -i
ただし、ファイルに文字列が含まれている場合にのみ、次のようになります。
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">
答え1
あなたの命令を仮定すると、
sed -i '1 a #This is just a commented line'
そのファイルに適用されます。
ファイルに適用するには、somefile
ファイルに文字列が含まれている場合は、<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">
次のものを使用できます。
if grep -q -F '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">' somefile
then
sed -i '1 a #This is just a commented line' somefile
fi
オプションを使用する-q
と、grep
ユーティリティは最初の一致で停止し、何も出力されません(終了状態にのみ興味があります)。このオプションを使用すると、与えられたパターンは正規表現ではなく文字列として扱われ-F
ます。grep
現在のディレクトリ内のすべてのファイルに適用するには(非正規ファイルまたは一般ファイルへのシンボリックリンクファイルをスキップ):
pattern='<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">'
for name in ./*; do
[ ! -f "$name" ] && continue
if grep -q -F -e "$pattern" "$name"; then
sed -i '1 a #This is just a commented line' "$name"
fi
done
私はここで-e "$pattern"
、および-e
オプションを使用しています。パターンが変数に保存されたら、grep
パターンを指定することをお勧めします。-e
変数の値がダッシュで始まる場合があります(明らかにこの特定の質問ではそうではありません)。ダッシュを使用しgrep
ない-e
と、パターンが実際にコマンドラインオプションであると考えるように混乱を招く可能性があります。
現在のディレクトリ内または以下のすべてのファイルに対してこれを行うには、次の手順を実行します。
pattern='<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">'
find . -type f -exec sh -c '
pattern=$1; shift
for name do
if grep -q -F -e "$pattern" "$name"; then
sed -i "1 a #This is just a commented line" "$name"
fi
done' sh "$pattern" {} +
その後、sh -c
見つかったファイルのバッチに対して短いインラインスクリプトが実行され、パターンを最初のコマンドライン引数としてスクリプトに渡し、見つかったパス名を残りの引数に渡します。
またはテストfind
として使用し、テストに合格したファイルで実行するようにします。grep
sed
pattern='<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7">'
find . -type f \
-exec grep -q -F -e "$pattern" {} \; \
-exec sed -i '1 a #This is just a commented line' {} +
{} +
上記のコマンドの最後に代わりを使用すると、各ファイルに対して一度実行するのではなく、一度にできるだけ多くの入力ファイルが提供されます。これがうまく機能するにはGNUが必要ですが、すでにコマンドにGNU構文を使用しているので大丈夫だとします。{} \;
sed
sed
sed
sed
sed
a
また、見ることができます「find」の-execオプションについて