Chris Down은 블록에 명시적인 'if'문을 사용하여 정규 표현식에 대한 else를 얻는 방법을 이미 보여주었습니다. 그의 해결책이 더 나을 수도 있지만 다른 방법으로도 동일한 효과를 얻을 수 있습니다.
하나는 다른 것과 일치하지 않는 텍스트와 만 일치하는 세 번째 정규 표현식을 작성하는 것입니다.이 경우 다음과 같이 보일 것입니다.
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
이것은 고정 된 정규 표현식을 사용합니다-정규 표현식의 시작 부분에있는 ^는 줄의 시작 부분에서만 일치합니다-원래 패턴은이 작업을 수행하지 않았습니다. 다음 줄까지 건너 뜁니다. 세 번째 ( "else")는 'R'([^ R])이 아닌 일부 문자로 시작하거나 'R'로 시작하고 그 뒤에 '1'또는 '이 아닌 문자가 오는 행과 일치합니다. 2 '(R [^ 12]). ^의 두 가지 다른 의미는 다소 혼란 스럽지만 그 실수는 오래 전에 만들어졌으며 곧 바뀌지 않을 것입니다.
보완 정규 표현식을 사용하려면 실제로 고정해야합니다. 그렇지 않으면 [^ R]이 뒤에 오는 1과 일치합니다. 매우 간단한 정규식의 경우이 방법이 유용 할 수 있지만 정규식이 복잡해지면이 방법을 관리 할 수 없게됩니다. 대신 다음과 같이 각 줄에 상태 변수를 사용할 수 있습니다.
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
이렇게하면 각 줄 바꿈마다 처리 된 값이 0으로 설정되고 두 정규 표현식 중 하나와 일치하면 1로 설정되고 마지막으로 여전히 0 인 경우 $ 0 인쇄를 실행합니다.