次のコードブロックがあります。
DIV='_'
STRING=’1__2__3__4__5'
echo $STRING
結果:
1__2__3__4__5
結果は次のようになります。
1_2_3_4_5
これは大きなコードベースの断片なので、$STRING
重複したダッシュを削除するために直接編集することはできません。
私は以下を試しました:
echo ${STRING//$DIV$DIV/$DIV}
echo $STRING | sed -E "s/$DIV$DIV/$DIV/g"
しかし、結果はまだ次のようになります。
1__2__3__4__5
_
変更できる必要があるため、置換コマンドでは置換を使用できませんが、数字は常に2つのインスタンスに分かれています。$DIV
$DIV
$STRING
$DIV
答え1
使用tr
:
div=_
string=1__2__3__4__5
printf '%s\n' "$string" | tr -s -- "$div"
-s, --squeeze 繰り返し
最後に、指定されたSETにリストされている各反復文字シーケンスをその文字の単一の発生に置き換えます。
ksh93スタイルのシェルパラメータ拡張を使用します(extglob
必要ですbash
)。
shopt -s extglob
printf '%s\n' "${string//+("$div")/$div}"
これは1つ以上のパターンと一致_
し、それを次に置き換えます。_
答え2
おそらくこれはあなたが望む結果を得るのに役立ちます。
#!/bin/bash
# GNU bash, version 4.4.20
string="1__2__3__4__5" ; echo "${string//__/_}"