다음과 같은 명령문이 포함된 파일이 있습니다.
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~step
GNU 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
짝수 줄만 일치합니다.- 행이 짝수이면
255
로1
바꿉니다sub(255,1)
. 1
awk
인쇄를 위한 실제 조건입니다$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