変数に "/"が含まれているときにsedを使用する方法は?

変数に "/"が含まれているときにsedを使用する方法は?

スクリプトで実行して上記の2行を削除するには、次の行があります。しかし、今私の$ TEST変数には「/ DATA / test10」などの値が含まれ、私の変数IDには「10」が含まれます。 sedでどのように使用できますか?

sed -i ":a;N;s/\n/&/2;Ta;/path = $TEST\/$ID/s/.*//;P;D" /collection.txt

答え1

欲しいなら文字列をリテラルとして扱うsedすでに答えがあります。

escaped_testx="$(sed -e 's/[\/&]/\\&/g' <<< "$TEST"; echo x)"
escaped_test="${escaped_testx%x}"

追加x可能末尾の改行処理、そうでない場合は、コマンド置換によって削除されます。

答え2

/ をコマンドの区切り文字として使用することはsed s必須ではありません。区切り文字は s の後の最初の文字です。あなたはあなたが好きな(ほぼ)何でも使うことが|できます#/文字が多い項目(ファイル名パスなど)の場合は、カンマを使用することをお勧めします。カンマはベースラインの下にあるので見やすいので、ファイル名ではほとんど使用しません。

sed 's,^/home/me/subdir/,^/home/he/otherdir/,'

検索で見つからない文字を選択して置き換えます。 1つか2つある場合は、前にバックスラッシュを追加してください。

答え3

正規表現では、前にバックスラッシュを追加して文字をエスケープできます。

だから/それは\/

これにより、正規表現が見苦しく見えますが(s/\/home\/stuff\/dir1/\/home\/stuff/)動作します!

答え4

変数の値が実際に変更されないようにするには、次のように直接ストリーミングできます。

printf "%s\n" "$PATH/$ID"   |
sed   -e's|[]$/.\^[]|\\&|g' \
      -e's|.*|/path = &/g|' |
sed   -e':a;N;s/\n/&/2;Ta' -f- -eP\;D /collection.txt

両方の変数に改行文字を含めることができないとします。また、次のような仮定をします。

/path = $TEST\/$ID/s/.*//

...つまり、ラインを消したいだけです。getを使用して、空の予約スペースでパターンスペースを上書きできます。(少なくともこのスクリプトでは例では使用されていないので空です)。同じ目的でzGNUでapを使用することもできます。sed

関連情報