awkのgensubまたは代替を使用して重複する一致を置き換える方法

awkのgensubまたは代替を使用して重複する一致を置き換える方法

私は以下を使用しています:

$ echo ".a.b.c." | awk '
{
  t=gensub(/.([a-z])./,"[\\1]","g",$1); print t
}'
[a]b[c]

私はそれを終了したい[a][b][c]gensub重複一致処理を開始するにはどうすればよいですか?

これができない場合、どうすればこれを達成できますか?

ベストアンサー1

次のようにできます。

perl -pe 's{\.([a-z](?:\.[a-z])*)\.}{"[$1]" =~ s/\./][/gr}ge'

つまり、すべてをに変更し、.x.y.z.sを[x.y.z].置き換えます][

またawkgensub()成功の有無を教えてくれないので、具体的で使いにくいgawkの使用を避けてください。

awk '
  {
    while(match($0, /(\.[abcdefghijklmnopqrstuvwxyz])+\./)) {
      s = substr($0, RSTART + 1, RLENGTH - 2)
      gsub(/\./, "][", s)
      $0 = substr($0, 1, RSTART - 1) "["s"]" substr($0, RSTART+RLENGTH)
    }
    print
  }'

現在のバージョンmawk(まだローカライズされていない)または最新バージョンを使用している場合、またはgawkCロケールの場合abcdefghijklmnopqrstuvwxyzに置き換えることができますa-z。これらの条件を超えた場合、同一であるという保証はありません。特に、一部のロケールでは、[a-z]各 POSIX は次の順序に一致するように設計されています。要素の構成、いいえ数値ddzsハンガリー語のロケールのように複数の文字を一致させることもできます。

とにかく正規表現で文字通りのポイントを一致させるには、\.またはが必要です[.].それ以外の場合は、それ自体が単一文字に一致する正規表現演算子です。

おすすめ記事