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
답변2
거의 맞지만 awk
필드를 교체한 다음 전체 줄을 인쇄하려고 합니다. 또한 출력 필드 구분 기호가 제거되었으며 누락된 쉼표와 닫는 괄호가 수동으로 추가되었습니다.
awk 'BEGIN {FS="[,)]" ; OFS="" } /ByteField/ && $2 > 50 {$2=", "$2+1")"} ; 1' file
항상 true 이면 1
행이 항상 인쇄됩니다(모든 행에 대해). 필드를 변경한 후에 인쇄해야 합니다. 견고성을 향상시키기 위해 일치 항목을 추가했습니다 /ByteField/
.
대체 파일의 경우: cat
출력과 동일한 파일을 사용하는 명령의 중복 및 파이핑이 중단됩니다. 다른 방법을 사용하십시오. 예를 들어
GNU awk 사용
awk -i inplace 'BEGIN ....' file
스펀지 첨부
awk 'BEGIN ...' file | sponge file
아니면 임시 파일을 사용하세요
awk 'BEGIN ...' file > file.alt
mv file.alt file