bash は文字列内のすべてのスラッシュに対してバックスラッシュを挿入します。

bash は文字列内のすべてのスラッシュに対してバックスラッシュを挿入します。

パスとして文字列があります。

/tmp/something

バックスラッシュを使用してスラッシュをエスケープする必要があります。

\/tmp\/something

どうすればいいですか?おそらくsed

正しい方向を教えてください。

答え1

Bashの独自の変数操作方法(パラメータ拡張)を使用してこれを実行できますが、構文は非常にひどいです。

$ string='/tmp/something'
$ escapedstring="${string//\//\\\/}"
$ printf '%s\n' "$escapedstring"     
\/tmp\/something

これをより詳細に説明するために、bashは${var//xxx/yyy}「変数をインポートしてvarすべての項目をxxx」に置き換えることを意味しますyyy。この場合、代替側と置換を指定するときにスラッシュをエスケープする必要があります。前者は\/単一のスラッシュ用で、後者は\\\/バックスラッシュと前方のスラッシュを追加したものなので面白い${string//\//\\\/}形が。

バックスラッシュ文字は実装や環境に応じて直接処理される可能性があるため、コンテンツを表示するechoために使用しないでください。echo

答え2

sed正しい方向です!同様のチュートリアルに従ってくださいhttps://www.grymoire.com/Unix/Sed.html#uh-1;最も基本的な方法は

echo $string | sed 's;old;replacement;g' 

sコマンドがある場所(例:「検索と置換」)は、g「完了するまですべての行で繰り返す」を意味するフラグであり、old置き換えたい項目(/あなたの場合)はreplacement置き換えたい項目です。 (バックスラッシュをエスケープする必要があるかもしれません\\/。)

楽しくお過ごしください!

答え3

この行に沿って実行できるいくつかの作業があります。

# let
str='/tmp/something'
str_esc=$(printf '%s\n' "$str" | sed 's:/:\\&:g')

関連情報