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で変数を参照する方法の詳細については、こちらをご覧ください。協会