sedを使用して変数に保存されたファイル名を書き込むには?

sedを使用して変数に保存されたファイル名を書き込むには?

bashスクリプトでは、sedファイル名がbash変数に格納されているファイルにどのように書きますか?あるファイルを内部で編集し、正規表現に一致する行を別のファイルにドラッグしてから最初のファイルから削除しようとするため、出力リダイレクトは機能しません。

それは次のとおりです。

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

...しかし、どちらも実際にfile1どこにfile2ありますか?変わりやすいそれ捕まえるファイル名。 (例えばfile2=$(mktemp)。)

だから私が本当に欲しいのはファイル名の変数拡張ですが、コマンドの残りの部分は拡張せずにsed内容全体をsed単一の引数としてコマンドに渡すことです。

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

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

「{と​​一致しません」というメッセージが表示され、その理由を理解できませんでした。

私ができる方法はありますか?

答え1

単一の式を使用しているのでsed(含む)以降の内容はすべてw}次のように解釈されます。仕事文書名前:

このパラメーターはwfile編集コマンドを終了する必要があります。

次の2番目のコマンドを追加すると、それを確認できます}

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

その後、一致する行がwhere拡張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'エラーは発生せず、代わりに次から始まるすべての行を作成することがわかります。l名前付きtesting;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で変数を参照する方法の詳細については、こちらをご覧ください。協会

関連情報