正規表現に一致する数を1つ減らすには?

正規表現に一致する数を1つ減らすには?

連続した各数字を「1」ずつ減らすスクリプトを作成しようとするのに得たのは「0」だけです。

awk '{a=gensub(/([0-9]+)/,"\\1","g",$0);
     if(a~/[0-9]+/) {gsub(/[0-9]+/,a-1,$0);}
     print $0}'

たとえば、文字列は次のようになります。

1,2,3,4-7

結果は次のとおりです。

0,1,2,3-6

代わりに、私は次のようになります。

0,0,0,0-0

ベストアンサー1

awk代替機能はかなり制限されています。一致する部品の少なくとも一部を交換品に含めるgawkことができますが、その部品の操作は実行できません。gensub()

動作しますawkが、別のアプローチを取る必要があります。

awk '{
  text = $0
  $0 = ""
  while (match(text, /[0-9]+/)) {
    $0 = $0 substr(text, 1, RSTART-1) \
         (substr(text, RSTART, RLENGTH) - 1)
    text = substr(text, RSTART+RLENGTH)
  }
  $0 = $0 text
  print}'

あるいは、awk@jofelのメソッドの変形としてGNUを使用してください。

gawk -v 'RS=[0-9]+' '{printf "%s", $0 (RT==""?"":RT-1)}'

または

gawk -v 'RS=[^0-9]+' '{printf "%s",($0==""?"":$0 - 1)RT}'

しかし、ここで使用する方が簡単ですperl

perl -pe 's/\d+/$&-1/ge'

perlキャプチャグループ(たとえば$1$2...、および$&完全一致部分)を使用でき、このeフラグを使用してこれらのキャプチャグループを使用して任意の式を実行できますperl

おすすめ記事