1

文字列から色付けコードを削除しようとしています。例: から:\033[36;1mDISK\033[0mへ:DISK

私の正規表現は次のようになります: \033.*?m'\033' の後に任意の数の文字が続き、'm' で終了します

パターンを検索すると、一致が見つかります。true[[ "$var" =~ $regex ]]と評価される

ただし、一致を置き換えようとすると、何も起こらず、同じ文字列が返されます。

これが私の完全なスクリプトです:

regex="\033.*?m"
var="\033[36;1mDISK\033[0m"

if [[ "$var" =~ $regex ]]
then
        echo "matches"
        echo ${var//$regex}
else
        echo "doesn't match!"
fi

問題は、正規表現の任意の文字部分の任意の数に一致しているようです。正常に置き換えることDISKができますが、それを変更するD.*KD.*?K、失敗すると失敗します。

上記のすべてのケースで、パターンは文字列に一致すると主張していますが、置換時に失敗することに注意してください。これでどこに行けばいいのかわからないので、助けていただければ幸いです。

ありがとう

4

2 に答える 2

1

次のようにする必要があります。

$ var="\033[36;1mDISK\033[0m"
$ newvar=$(printf ${var} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
$ echo ${newvar}

戻り値:

DISK

さっそく検証!

$ echo $var | od
0000000 030134 031463 031533 035466 066461 044504 045523 030134
0000020 031463 030133 005155
0000026
$ echo $newvar | od
0000000 044504 045523 000012
0000005
于 2013-06-13T13:05:50.293 に答える
1

パラメータ展開置換演算子を使用するには、拡張グロブを使用する必要があります。

shopt -s extglob
newvar=${var//\\033\[*([0-9;])m}

それを分解するには:

  • \\033\[- エンコードされたエスケープ文字と[.
  • *([0-9;])- 0 個以上の数字またはセミコロンに一致します。+([0-9;])(より正確には?)1つ以上の数字またはセミコロンに一致させるために使用できます
  • m- 末尾のm.
于 2013-06-13T14:47:51.830 に答える