それが行ベースで、1行だけを置き換える場合は、を使用してファイル自体に置換行を付加しprintf
、その最初の行をsed
のホールドスペースに格納し、必要に応じてドロップすることをお勧めします。これにより、特殊文字をまったく気にする必要がなくなります。(ここでの唯一の仮定は、$VAR
改行のない1行のテキストを含むということです。これは既にコメントで述べたとおりです。)改行以外は、VARは何でも含むことができ、これは関係なく機能します。
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/KEYWORD/g'
printf '%s\n'
の内容に$VAR
関係なく、の内容をリテラル文字列として出力し、その後に改行が続きます。(echo
の内容が$VAR
ハイフンで始まる場合など、場合によっては他のことも行います—に渡されるオプションフラグとして解釈されますecho
。)
中括弧は、に渡されるのprintf
コンテンツの前に出力を付加するために使用されます。ここでは、中括弧をそれ自体で区切る空白文字が重要です。中括弧の前のセミコロンも同様です。somefile
sed
1{h;d;};
sed
コマンド内のテキストの最初の行を格納するsed
の保持空間次いで、d
ライン(というより、それを印刷)elete。
/KEYWORD/
を含むすべての行に次のアクションを適用しますKEYWORD
。アクションはg
etで、ホールドスペースの内容を取得し、パターンスペースの代わりにドロップします。つまり、現在の行全体です。(これは行の一部だけを置き換えるためのものではありません。)ちなみに、ホールドスペースは空にならず、パターンスペースにコピーされ、そこにあるものはすべて置き換えられます。
正規表現をアンカーして、KEYWORD だけを含み、その行にKEYWORD以外に何もない行だけを含む行と一致しないようにするには、行の先頭のアンカー(^
)と行の終わりのアンカー($
)を追加します。あなたの正規表現:
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'
sed
ない場合は、バックスラッシュでエスケープします。VAR='hi\/'
そのような問題はありません。