sed: 일치하는 항목이 발견되면 이전 줄의 텍스트 일부를 바꿉니다.

sed: 일치하는 항목이 발견되면 이전 줄의 텍스트 일부를 바꿉니다.

다음 줄에 가 포함된 경우 create_test파일을 로 바꾸고 싶습니다 . sed를 사용하여 이를 포함하는 전체 파일을 처리하려면 어떻게 해야 합니까?#create_testpsfxxx_16_pi

입력 파일 내용:

create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

결과물 파일:

#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

답변1

노력하다

sed '/^create_test/ {N; /psfxxx/ s/^/#/}' file
#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 }

create_test -type hard -outer { 1.0000 } { \
    vsfxxx_16_pi/psfop/deadline_north_re_0 }

create_test -type hard -outer { 0.0000 } { \
    vsfxxx_16_pi/psfop/deadline_south_re_1 }

"create_test"가 발견되면 다음 줄을 추가하고, 줄에 "psfxxx"가 포함되어 있으면 "#" 접두사가 붙습니다.

답변2

또 다른 sed방법:

$ sed -zE 's/create_test([^\n]*\n[^\n]*psfxxx_16_pi)/#create_test\1/g' file
#create_test -type hard -outer { 1.0000 } { \
    psfxxx_16_pi/psfop/deadline_north_re_0 }

#create_test -type hard -outer { 0.0000 } { \
    psfxxx_16_pi/psfop/deadline_south_re_1 

답변3

만약 awk가 이렇게 한다면:

awk '/psfxxx_16_pi/{prev = "#" prev} {print prev} {prev = $0} END {print}'

prev여기에서는 각 줄에 대해 이전 줄( 에 저장됨)을 인쇄하고 $0다음 반복을 위해 저장합니다 prev. 줄이 일치하면 끝에 .를 추가하여 마지막 줄을 인쇄합니다 #.prev

관련 정보