sed + 문자열이 포함된 줄을 삭제합니다(다음 줄 제외)

sed + 문자열이 포함된 줄을 삭제합니다(다음 줄 제외)

이 sed 명령은 "rocommunity"라는 단어가 포함된 줄을 삭제합니다.

sed -i '/rocommunity/d' snmpd.conf

rocommunity hedona 127.0.0.1
rocommunity hedona linux1 
rocommunity hedona linux12
rocommunity hedona linux13
rocommunity hedona linux15
rocommunity hedona linux16
rocommunity hedona linux17
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona

rocommunity가 포함된 행(127.0.0.1이 포함된 행 제외)을 제거하기 위해 sed를 어떻게 업데이트합니까?

예상 출력:

rocommunity hedona 127.0.0.1
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona

답변1

두 가지 검색을 결합하면 됩니다.

sed  '/rocommunity.*127\.0\.0\.1/p;/rocommunity/d' /path/to/input

/rocommunity.*127\.0\.0\.1/p- rocommunityfor 와 일치하는 줄에서 해당 127.0.0.1줄을 인쇄합니다.

/rocommunity/d- 일치하는 줄에서는 rocommunity인쇄하지 않습니다.

다른 모든 내용은 인쇄됩니다.

파일을 변경하려면 file 원하는 작업을 확인한 후 를 sed --in-place사용하여 파일을 변경할 수 있습니다.

답변2

$ sed -n -e '/rocommunity.*127.0.0.1/p' -e '/rocommunity/!p' data.in >data.out

sed명령은 먼저 각 줄의 기본 인쇄를 끈 다음( -n) 두 가지 편집 명령( -e)을 사용합니다. 첫 번째는 해당 단어가 포함된 행을 인쇄 rocommunity한 다음 127.0.0.1해당 행의 다음 단어를 인쇄합니다. 두 번째 편집 명령은 포함되지 않은 모든 행을 인쇄합니다 rocommunity.

질문 시작 부분의 데이터:

$ sed -n -e '/rocommunity.*127.0.0.1/p' -e '/rocommunity/!p' data.in
rocommunity hedona 127.0.0.1
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona

답변3

"rocommunity"와 "127.0.0.1" 브랜치가 끝까지 일치하면. 그리고 그 줄을 인쇄할 것이다.

sed -e '/rocommunity{/127\.0\.0\.1/b' -e 'd;}' file

GNU 구현을 사용하면 sed다음과 같이 단축할 수 있습니다.

sed '/rocommunity/{/127\.0\.0\.1/b;d}' file

관련 정보