繰り返される文字の縮小

繰り返される文字の縮小

echo "$PWD//" | sed -e 's#//\+#/#g'繰り返されるスラッシュを単一のスラッシュに置き換えるよりも、Bashist方式はありますか?

ありがとうスティーブンD、今見つけることができる完全に機能する機能があります。2 つ以上のパスのうち最も長い共通パス:パブリックパス

答え1

「Bashのみ」の答えではありませんが、役に立つかもしれません。

echo "$PWD///" | tr -s '/'

答え2

「pure bash」で使用できますが、extglob有効になっている場合にのみ使用できます。

$ shopt -s extglob
$ A="////qsd/////sdfgfg//qsd//////"
$ echo ${A//\/+(\/)/\/}
/qsd/sdfgfg/qsd/

答え3

変数を使用して Bash のみを使用:

# code:
shopt -s extglob
A="$PWD//"; 
echo "Original: $A"; 
echo "Result:   ${A//+(\/)//}"

# output:
Original: /home/myhome/Projects/Bob/build//
Result:   /home/myhome/Projects/Bob/build/
  • //=検索と置換、検索と置換の継続

  • +(/) = 1 つ以上の「/」と一致

  • // = "/"に置き換えられました

より良い視覚的な例のために、スラッシュから抜け出さずにそれをよりよく見るためには、${VAR//pattern/string}で検索/置換しないように「z」を押す必要があるとします。基本構造は難読化されています。 :

# code:
shopt -s extglob
A=zzz/zzz/zzzzz/zzzz/zzzz; 
echo $A; 
echo ${A//+(z)/z}

# output:
zzz/zzz/zzzzz/zzzz/zzzz
z/z/z/z/z

答え4

修正する:人主(+1)正しいアイデアを得ました...私の答えは奇数の「/」にのみ適用されます。

もちろんいいえ設定するには「extglob」が必要です。

var="$PWD///"; var="${var//\/\//}" エコー "$var"

関連情報