Linux 시스템에 텍스트 파일이 있고 사용자가 Perl 스크립트를 사용하여 입력한 줄에 3개의 sed 명령을 실행하려고 합니다. 지금까지는 이 작업을 수동으로 수행했습니다.
내가 사용해야 하는 sed 명령은 다음과 같습니다.
sed -i "s/{+//" error.txt
sed -i "s/+}//" error.txt
sed -i "s/\[-.*-]//g" error.txt
error.txt
은 이 명령을 실행하려는 파일이지만 입력할 특정 줄에서 실행되기를 원합니다.
오류.txt:
1:module counter ( clk, reset, enable, {+dat_out+} );
4: input clk, [-reset ;-] {+reset, enable;+}
5: wire {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80,
10: EDFFX2AD \dat_out_sig_reg[0] ( [-.D(synopsis_unconnected),-] {+.D(N69),+} .E(N96), .CK(clk), .Q(dat_out[0])
12: EDFFX2AD \dat_out_sig_reg[1] ( {+.D(N70),+} .E(N94), .CK(clk), .Q(dat_out[1])
14: EDFFX2AD \dat_out_sig_reg[2] ( .D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+} .CK(clk), .Q(dat_out[2])
예상 출력:
1:module counter ( clk, reset, enable, dat_out );
4: input clk, [-reset ;-] {+reset, enable;+}
5: wire {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80,
10: EDFFX2AD \dat_out_sig_reg[0] ( .D(N69), .E(N96), .CK(clk), .Q(dat_out[0])
12: EDFFX2AD \dat_out_sig_reg[1] ( {+.D(N70),+} .E(N94), .CK(clk), .Q(dat_out[1])
14: EDFFX2AD \dat_out_sig_reg[2] ( .D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+} .CK(clk), .Q(dat_out[2])
이 코드는 1호선과 10호선에 적용됩니다. 제안해 주세요
답변1
검색 패턴 등의 형태로 기준을 지정할 수 있습니다.
sed -i -r '/^10?:/ {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
1:
대체는 행이 또는 로 시작하는 경우에만 수행됩니다 10:
. 출력은 다음과 같습니다.
1:module counter ( clk, reset, enable, dat_out );
4: input clk, [-reset ;-] {+reset, enable;+}
5: wire {+N69, N70, N71,+} N72, N73, N74, N75, N76, N77, N78, N79, N80,
10: EDFFX2AD \dat_out_sig_reg[0] ( .D(N69), .E(N96), .CK(clk), .Q(dat_out[0])
12: EDFFX2AD \dat_out_sig_reg[1] ( {+.D(N70),+} .E(N94), .CK(clk), .Q(dat_out[1])
14: EDFFX2AD \dat_out_sig_reg[2] ( .D(N71), [-.E(synopsis_unconnected),-] {+.E(N92),+} .CK(clk), .Q(dat_out[2])
조건은 줄 번호일 수 있습니다. 이는 첫 번째 줄만 처리합니다.
sed -i -r '1 {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
Perl을 언급했으므로 다음을 사용하는 것이 더 나을 수도 있습니다.
perl -i -pe 'if (/^10?:/) {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
또는:
perl -i -pe 'if ($.==1 or $.==10) {s/\{\+//; s/\+}//; s/\[-.*-]//g}' error.txt
답변2
명령 앞에 줄이나 범위를 추가할 수 있습니다 sed
.
첫 번째 예에서는 세 번째 줄 #4를 시도해 볼 수 있습니다.
sed "3 s/{+//" error.txt
또는 스크립트가 필요한 경우 다음 코드 조각을 사용할 수 있습니다.
#!/bin/bash
echo -e "Usage:\t ./my_sed.sh linenumber file\n"
sed "$1 s/{+//" $2