文字列で繰り返される変数を置き換える方法は? [閉鎖]

文字列で繰り返される変数を置き換える方法は? [閉鎖]

次のコードブロックがあります。

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//__/_}"

テスト対象:https://rextester.com/l/bash_online_compiler

関連情報