Bashスクリプトでのみ/./
または/././
または/./././
を/
に置き換えようとしています。 sedの正規表現を作成できましたが、機能しません。
variable="something/./././"
variable=$(echo $variable | sed "s/\/(\.\/)+/\//g")
echo $variable # this should output "something/"
/./
部分文字列のみを置き換えようとすると、sed \/\.\/
の正規表現で機能しました。 sed regexでは、+
または*
とサブストリングの乗算を使用するためにより多くのフラグが必要ですか?
使用する -r
拡張正規表現を使用するsed
を作成するオプション:
$ variable="something/./././"
$ echo $variable | sed -r "s/\/(\.\/)+/\//g"
something/
Sed:
sed 's|/\(\./\)\{1,\}|/|g'
しかし、+
または\{1,\}
はこの場合でも必要ありません。*
はうまくいくので、
sed 's|/\(\./\)*|/|g'
十分なはずです
簡単にするための2つのこと:
$ variable="something/./././"
$ sed -r 's#(\./){1,}##' <<< "$variable"
something/
{1,}
を使用して、1つ以上のパターンを示します。これにはg
は必要ありません。#
を使用して読みやすくします+
はEREなので、使用するには-E
または-r
オプションを有効にする必要がありますこれは、bashの組み込みパラメーター置換を使用して行うこともできます。これにはsed
は必要ありません。OSX上のMacでは-r
を受け入れません:
variable="something/./././"
a=${variable/\/*/}/ # Remove slash and everything after it, then re-apply slash afterwards
echo $a
something/
説明およびその他の例については、 here を参照してください。