それが行ベースで、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コンテンツの前に出力を付加するために使用されます。ここでは、中括弧をそれ自体で区切る空白文字が重要です。中括弧の前のセミコロンも同様です。somefilesed
1{h;d;};sedコマンド内のテキストの最初の行を格納するsedの保持空間次いで、dライン(というより、それを印刷)elete。
/KEYWORD/を含むすべての行に次のアクションを適用しますKEYWORD。アクションはgetで、ホールドスペースの内容を取得し、パターンスペースの代わりにドロップします。つまり、現在の行全体です。(これは行の一部だけを置き換えるためのものではありません。)ちなみに、ホールドスペースは空にならず、パターンスペースにコピーされ、そこにあるものはすべて置き換えられます。
正規表現をアンカーして、KEYWORD だけを含み、その行にKEYWORD以外に何もない行だけを含む行と一致しないようにするには、行の先頭のアンカー(^)と行の終わりのアンカー($)を追加します。あなたの正規表現:
VAR=whatever
{ printf '%s\n' "$VAR";cat somefile; } | sed '1{h;d;};/^KEYWORD$/g'
sedない場合は、バックスラッシュでエスケープします。VAR='hi\/'そのような問題はありません。