web-dev-qa-db-ja.com

sedを使用して、各空白をバックスラッシュで置き換えます

Windowsファイルパスのスペースをエスケープしたいだけです。私はこれを試しています:

echo "111  1111 "| sed -e "s/[[:space:]]/\\ /g"

スペースのみに一致しますが、置き換えは行いません。

1
Yurij

二重引用符を使用する場合、bash\\を解釈し、\を出力します。これは、sedから次のスペースとともにスペースだけに解釈されます。

したがって、もう1つのバックスラッシュが必要です。

echo "111  1111 " | sed -e "s/[[:space:]]/\\\ /g"

ただし、bashの解釈を防ぐために、単一引用符を使用することをお勧めします。

echo "111  1111 " | sed -e 's/[[:space:]]/\\ /g'

出力:

111\ \ 1111\ 

別の方法:

変数としてファイルパスがある場合は、シェルメソッドを使用できます。

path="111  1111 "
echo ${path// /\\ }
4
pLumo

_[[:space:]]_はスペースだけではなく、タブや改行を含むすべての空白文字に一致しません。本当にそれが必要な場合は、GNU sed(Ubuntuの場合と同様)に_\s_という省略クラスがあります。

_sed 's_\s_\\&_g'
_

このsubstitutesすべての(g)空白文字(_\s_、パターン、ホールドスペースに埋め込まれたスペース、タブ、改行)に、バックスラッシュ(_\\_)とそれ自体を付けたもの-_&_一致したパターン全体です。スラッシュとバックスラッシュは常に混乱しているように見えるため、別の区切り文字を使用しています。 _s/\s/\\&/g_ももちろん有効です。

space文字のみを置換する場合は、次のように使用します。

_sed 's_ _\\&_g'
_

実行例

_$ echo "111  1111 " | sed 's_ _\\&_g'
111\ \ 1111\ 
_

文字クラスの詳細については、 ここではregular-expressions.info を参照してください。

1
dessert