web-dev-qa-db-ja.com

sedプラス記号が機能しない

Bashスクリプトでのみ/./または/././または/./././/に置き換えようとしています。 sedの正規表現を作成できましたが、機能しません。

variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"

/./部分文字列のみを置き換えようとすると、sed \/\.\/の正規表現で機能しました。 sed regexでは、+または*とサブストリングの乗算を使用するためにより多くのフラグが必要ですか?

47
J33nn

使用する -r拡張正規表現を使用するsedを作成するオプション:

$ variable="something/./././"
$ echo $variable | sed -r "s/\/(\.\/)+/\//g"
something/
64
falsetru

Sed:

sed 's|/\(\./\)\{1,\}|/|g'

しかし、+または\{1,\}はこの場合でも必要ありません。*はうまくいくので、

sed 's|/\(\./\)*|/|g'

十分なはずです

3
Scrutinizer

簡単にするための2つのこと:

$ variable="something/./././"
$ sed -r 's#(\./){1,}##' <<< "$variable"
something/
  • {1,}を使用して、1つ以上のパターンを示します。これにはgは必要ありません。
  • 上記の場合、異なる区切り文字#を使用して読みやすくします
  • +はEREなので、使用するには-Eまたは-rオプションを有効にする必要があります
2
jaypal singh

これは、bashの組み込みパラメーター置換を使用して行うこともできます。これにはsedは必要ありません。OSX上のMacでは-rを受け入れません:

variable="something/./././"
a=${variable/\/*/}/                   # Remove slash and everything after it, then re-apply slash afterwards
echo $a
something/

説明およびその他の例については、 here を参照してください。

2
Mark Setchell