sed を使用して変数に格納されたファイル名に書き込むにはどうすればよいでしょうか?

sed を使用して変数に格納されたファイル名に書き込むにはどうすればよいでしょうか?

スクリプト内からbash、ファイル名が bash 変数に格納されているファイルに書き込むにはどうすればよいですかsed? 出力リダイレクトは、1 つのファイルをその場で編集し、正規表現に一致する行を別のファイルにプルし、最初のファイルでそれらを削除するため、実行できません。

何かのようなもの:

sed -i '/^my regex here$/{;w file2;d;}' file1

...しかし、実際には、とfile1file2変数それ所有ファイル名。(例file2=$(mktemp): .)

したがって、私が本当に望んでいるのは、ファイル名の変数展開ですが、コマンドの残りの部分は展開せずsed、全体をsedコマンドに渡される単一の引数として残すことです。

何らかの理由で、以下は機能しません。

sed -i '/my regex here/{;w '"$file2"';d;}' $file1

「一致しない {」と表示されますが、その理由がわかりません。

これを実行する方法はありますか?

答え1

単一のsed式を使用しているため、 の後に続くものw( を含む})はすべてと解釈されるwファイル名前:

引数はwfile編集コマンドを終了します。

}次のような2 番目のコマンドを追加すると、それがわかります。

sed -e '/my regex here/{w '"$file2"';d;}' -e '}' $file1

一致する行は、が展開されるmy regex here名前のファイルに保存されます。 正しい構文は、複数の式を使用して、別々のコマンドを使用することです。whatever;d;}whatever$file1

sed -e '/my regex here/{w '"$file1" -e 'd' -e '}' $file2

または 1 行に 1 つのコマンド:

sed '/my regex here/{
w '"$file1"'
d
}
' $file2

答え2

答えはスタックオーバーフロー「sed 'w' コマンドにファイル名の終了位置を知らせるにはどうすればよいですか?」

terdon が指摘したように、問題は変数ではありませんが、中括弧とも何の関係もありません。試してみると、エラーは発生せず、 で始まるすべての行がという名前のファイルにsed '/^l/w testing;p'書き込まれることがわかります。ltesting;p

実際のところ、問題はファイル名の後に改行がないことです。

したがって、答えは、sed コマンドでインライン改行を使用することです。

sed -i '/my regex here/{;w '"$file2"'
d;}' $file1

またはより簡潔な方法として、2 つの別々の-e引数を使用します。

sed -i -e '/my regex here/{;w '"$file2" -e 'd;}' $file1

2 つの隣接する引用符 (簡単に間違えてしまう可能性があります) が気に入らない場合は、write コマンドを独自の引数に置きます。

sed -i -e '/^my regex here$/{' -e "w $file2" -e 'd;}' $file1

答え3

sed コマンドを引用するには、単一引用符ではなく二重引用符を使用します。適切な文字をエスケープすることを忘れないでください。

bashでの変数の引用符に関する詳細は、こちらリンク

関連情報