AND, OR, NOT

sed 는 간단히 사칙연산을 할 수 있는 연산자도 없을뿐더러 AND, OR 연산자도 없습니다.
하지만 sed 의 기본기능을 활용하면 AND, OR 연산을 처리할 수가 있습니다.

AND

AND 연산은 보통 프로그래밍 언어에서 && 연산자로 표현되는데요.
sed 에서는 다음과 같은 방식으로 AND 연산 결과를 얻을 수 있습니다.

AA && BB
$ echo "AA 11 BB 22 CC" | sed -n '/AA/{ /BB/p }'
AA 11 BB 22 CC
AA && BB && CC
$ echo "AA 11 BB 22 CC" | sed -n '/AA/{ /BB/{ /CC/p } }'
AA 11 BB 22 CC

OR

OR 연산은 프로그래밍 언어에서 || 연산자에 해당하는데요.
sed 에서는 regex 에서 제공하는 | 연산자를 이용할 수 있습니다.

AA || BB
$ echo "11 BB 22 CC 33" | sed -En '/AA|BB/p'
11 BB 22 CC 33

$ echo "11 BB 22 CC 33" | sed -En -e '/AA/{bX}; /BB/{bX}; b' -e ':X p'
11 BB 22 CC 33
AA || BB || CC
$ echo "11 CC 22 DD 33" | sed -En '/AA|BB|CC/p'
11 CC 22 DD 33

$ echo "11 CC 22 DD 33" | sed -En -e '/AA/{bX}; /BB/{bX}; /CC/{bX}; b' -e ':X p'
AA 11 BB 22 CC

AND, OR

AA && ( 11 || 22 )
$ echo "AA 22 BB 33 CC" | sed -En '/AA/{ /11|22/p }'
AA 22 BB 33 CC
AA && BB && ( 11 || 22 || 33 )
$ echo "AA 33 BB 44 CC" | sed -En '/AA/{ /BB/{ /11|22|33/p } }'
AA 33 BB 44 CC
AA || ( 11 && 22 )
$ echo "BB 11 CC 22 DD" | sed -En -e '/AA/{bX}; /11/{ /22/{bX} }; b' -e ':X p'
BB 11 CC 22 DD
AA || BB || ( 11 && 22 && 33 )
$ echo "11 CC 22 DD 33" | sed -En -e '/AA|BB/{bX}; /11/{ /22/{ /33/{bX} } }; b' -e ':X p'
11 CC 22 DD 33

NOT

/.../ 뒤에 ! 문자를 붙이면 logical NOT 이 됩니다.

# 라인이 foo 로 시작하지 않을 경우 맨앞 또는 맨뒤에 'X' 를 붙인다.
$ echo "goobar 111 222" | sed -E '/^foo/! s/^|$/X/g'
Xgoobar 111 222X

# 뒤 이어지는 명령이 두 개 이상일 경우는 다음과 같이 { } 를 사용해야 합니다.
$ echo "goobar 111 222" | sed -E '/^foo/! { s/^|$/X/g; s/111/aaa/ }'
Xgoobar aaa 222X

$ echo "foobar 111 222" | sed -E '/^foo/! s/^|$/X/g'
foobar 111 222

# 다음식은 모두 동일한 것으로 공백라인 또는 '#' 문자로 시작하지 않을 경우 프린트됩니다.
sed -En '/^\s*$|^#/!p'

sed -En '/^\s*$/!{ /^#/!p }'

sed -En '/^#/!{ /^\s*$/!p }'

예제 1

데이터 파일 내용 중에서 rocommunity 가 있는 라인을 삭제합니다.
그런데 라인이 127.0.0.1 를 포함하고 있으면 삭제하지 않고 프린트합니다.

$ cat file
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

$ sed '/rocommunity/{ /127\.0\.0\.1/!d }' file
rocommunity hedona 127.0.0.1
syscontact linux 67
syslocation UNKNOWN
trapcommunity hedona
trapsink  linux76 parshedona