sed を使用して順方向とバックスラッシュをエスケープします。

sed を使用して順方向とバックスラッシュをエスケープします。

次の文字列があります。/tmp/test/folder1/test.txt

代わりに使用したいものsed- たとえば、次のようになります。/\/

\/tmp\/test\/folder1\/test.txt

だから私は以下を発行します:

echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\//g"

返されますが:

sed: -e 式 #1、文字 9: 's' の未知のオプション

私は前方とバックスラッシュをエスケープしています。ここで私がどこに間違っているのかわかりません。

答え1

\置き換えられたすべてのスラッシュ/とすべてのバックスラッシュをそれぞれエスケープ(バックスラッシュを使用)する必要があります。\

$ echo "/tmp/test/folder1/test.txt" | sed 's/\//\\\//g'
\/tmp\/test\/folder1\/test.txt

しかし、これはまったく読むことができません。

ただし、sedほとんどすべての文字を区切り文字として使用できます。/これは、スラッシュ自体を変更したい場合に特に便利です/(たとえば、;セミコロンを区切り文字として使用すると、コマンドが簡単になります)。

echo "/tmp/test/folder1/test.txt" | sed 's;/;\\/;g'

その他の場合:

  • スラッシュを区切り文字として使用し、二重引用符を使用するには、エスケープされたすべてのバックスラッシュを再エスケープしてリテラル値を維持する必要があります。

    echo "/tmp/test/folder1/test.txt" | sed "s/\//\\\\\//g"
    
  • 引用符がまったく必要ない場合は、別のバックスラッシュが必要です。

    echo "/tmp/test/folder1/test.txt" | sed s/\\//\\\\\\//g
    

答え2

または、値が(bash)シェル変数にある場合:

var=/tmp/test/folder1/test.txt
$ echo "${var//\//\\\/}"
\/tmp\/test\/folder1\/test.txt

初めて//スタートパラメータ拡張、交換するように言うみんな交換と一致します。以下は一致させるエスケープ文字で\/、エスケープ文字の後に代替文字が続きます。/\\\/\/

答え3

最終的な解決策は次のとおりです。

$ sed 's:/:\\/:g'  <<<"$str"
\/tmp\/test\/folder1\/test.txt

しかし、そこに行く方法を説明しましょう:
はい、バックスラッシュを逃しました。

$ str='/tmp/test/folder1/test.txt'
$ sed "s/\//\\\\\//g" <<<"$str"
\/tmp\/test\/folder1\/test.txt

明確にできる空間があってほしいです。

$ sed "s/\//\\\\ \//g"  <<<"$str"
\ /tmp\ /test\ /folder1\ /test.txt

ただし、sed区切り文字を次のように変更したい場合:(例:)

$  sed "s:\/:\\\\\/:g"  <<<"$str"
\/tmp\/test\/folder1\/test.txt

しかし、これは厳密に言えば真実ではありません。なぜなら(現在は具体的ではありませんが)、/スケーピングが必要ないからです。

$ sed "s:/:\\\\/:g"  <<<"$str"
\/tmp\/test\/folder1\/test.txt

そして二重引用符の代わりに一重引用符を使用すると、シェルは二重引用符を\\1に変更しないため、より少ない方が\正確です。

$ sed 's:/:\\/:g'  <<<"$str"
\/tmp\/test\/folder1\/test.txt

かなりきれいです。

関連情報