連続した各数字を「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
。