ファイルに特定の文字列が含まれている場合は、特定の場所に行を挿入します。

ファイルに特定の文字列が含まれている場合は、特定の場所に行を挿入します。

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として使用し、テストに合格したファイルで実行するようにします。grepsed

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構文を使用しているので大丈夫だとします。{} \;sedsedsedsedseda

また、見ることができます「find」の-execオプションについて

関連情報