단일 파일을 반복적으로 편집

단일 파일을 반복적으로 편집

다음과 같은 명령문이 포함된 파일이 있습니다.

myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(255)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(255)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(255)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(255)
etc

나는 그것을 다음과 같이 바꾸고 싶습니다 :

myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)
etc

어쨌든, 추가 질문은 속성 이름이 "in$"로 끝나는 항목만 변경하고 싶다는 것입니다. 여기서 $는 숫자입니다(예: myName_in_3 VARCHAR(255)).

공교롭게도 '_in'(지시자 속성)이 쌍으로 나오므로 n~2(또는 FNR%2==0)를 수행하는 것은 꽤 현명한 방법이지만 '_in$VARCHAR('을 식별하는 것이 더 나을지 궁금합니다. ?255)'를 변화의 모델로 삼고 있다.

이해하기 쉬운 코드를 사용하여 이 작업을 어떻게 수행합니까? 파일이 크지 않으므로 성능은 큰 문제가 되지 않습니다....단지 많은 수동 vi 편집을 피하려고 노력하는 것뿐입니다.

답변1

first~stepGNU sed를 사용하면 두 번째 줄부터 시작하는 다른 모든 줄이 수정되도록 형식으로 줄 주소를 지정할 수 있습니다 2~2.

$ sed '2~2 s/(255)/(1)/' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)

답변2

그리고 awk:

$ awk 'FNR%2==0{sub(255,1)}1' file
myName_tx_1 VARCHAR(255)
myName_in_1 VARCHAR(1)
myName_tx_2 VARCHAR(255)
myName_in_2 VARCHAR(1)
myName_tx_3 VARCHAR(255)
myName_in_3 VARCHAR(1)
myAddress_tx_1 VARCHAR(255)
myAddress_in_2 VARCHAR(1)

설명하다

  • FNR%2==0짝수 줄만 일치합니다.
  • 행이 짝수이면 2551바꿉니다 sub(255,1).
  • 1awk인쇄를 위한 실제 조건입니다 $0.

다음과 같은 다른 도구에도 동일한 논리를 사용할 수 있습니다 perl.

perl -pe 's/255/1/ unless $. % 2' file

를 사용하면 sed다음을 수행할 수 있습니다.

sed -e 'n;s/255/1/' file

고쳐 쓰다

귀하의 업데이트 요청에 따라 솔루션을 약간 변경할 수 있습니다.

그리고 awk:

awk '/_in_[0-9]/{sub(255,1)}1' file

그리고 sed:

sed -e '/_in_[0-9]/{s/255/1/}' file

그리고 perl:

perl -pe 's/255/1/ if /_in_[0-9]/' file

답변3

가지다

sed '/_in_/ s/255/1/'

즉, 일치하는 행에 대해 /_in_/검색 255하고 로 바꿉니다 1.

답변4

cat oldfile.txt |awk '/_in_[0-9]/{sub(255,1)}1' > newfile.txt

관련 정보