Builder.java
次の行を含むファイルがあります。
public class Builder{
@Override
public void setCallId(long value) {
set4ByteField(value, 48);
setLogtype(1);
setVerify("ABAB");
}
public void setOriginCallId(long value) {
set8ByteField(value, 52);
}
public void setDateTimeYear(int value) {
set2ByteField(value, 60);
}
...
その後、50より大きい数字を+1数字に置き換え、残りはそのままにします。結果:
public class Builder{
@Override
public void setCallId(long value) {
set4ByteField(value, 48);
setLogtype(1);
setVerifyflag("ABAB");
}
public void setOriginCallId(long value) {
set8ByteField(value, 53);
}
public void setDateTimeYear(int value) {
set2ByteField(value, 61);
}
....
}
ベストを尽くしたが、次のようには機能しないスクリプトを書いた。
cat Builder.java | awk -F'[,)]' '$2>50 {print $2+1}' > Builder.java
ベストアンサー1
絶対値が50より大きいすべての数値を増やします。
perl -pe 's/\b(\d+)\b/$1>50 ? $1+1 : $1/ge' file
\d+
パターンは境界()を持つ一連の数字()なので、\b
数字と一致しません。4
set4ByteField
e
バナーコマンドが終了したら、置換項目を式として扱うことができます。 三項式~へキャプチャされたグループ。50より大きいすべての数字を増やします。
perl -pe 's/(^|[^-])\b(\d+)\b/$1.($2>50 ? $2+1 : $2)/ge' file
^|[^-]
ハイフンマイナス記号を除いて、行の先頭または一連の数字の左側のすべての文字と一致します。負の数は除外されます。
しかし、ファイルに書き込むと同時にファイルから読み取ってはいけません。ファイルを処理する前に切り取ろうとすると、空のファイルが生成されます。ファイルをその場で編集するには、Perlの-i
フラグを使用します(参照
コマンドラインオプション)。より良い方法は、問題が発生した場合に備えて元の-i.bak
ファイルを拡張子として保存することです。.bak