특정 줄에서 sed 명령 사용

특정 줄에서 sed 명령 사용

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

관련 정보