
次の文字列があります。/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
かなりきれいです。