50보다 큰 파일의 숫자 늘리기

50보다 큰 파일의 숫자 늘리기

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숫자와 일치하지 않습니다 .4set4ByteFielde배너명령이 끝나면 대체 항목을 표현식으로 처리할 수 있습니다. 삼항 표현~에캡처된 그룹.

  • 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

관련 정보