awk에서 기울어진 이쑤시개 증후군을 피하는 방법은 무엇입니까?

awk에서 기울어진 이쑤시개 증후군을 피하는 방법은 무엇입니까?

패턴을 /일치 시키면 /빠르게 탈출해야 하는 것이 다루기 힘들고 보기 흉해집니다 .

/\/usr\/share\/man\//

sed, perl 또는 Vim의 경우 정규식에 대해 다른 구분 기호를 사용합니다 :. 예를 들면 다음과 같습니다.

sed '\:/usr/share/man/: do something'
perl -ne 'print if m:/usr/share/man/:'
:g:/usr/share/man/: do something " Vim

이 문제를 어떻게 피할 수 있나요? 그것은 다음과 같습니다:

awk ':/usr/share/man/: {do something}'

내가 생각할 수 있는 가장 좋은 방법은 변수를 사용하는 것입니다.

awk -v pat='/usr/share/man/' '$0 ~ pat {do something}'

그러나 이는 sed/perl/vim 접근 방식에 비해 매우 장황합니다.


물론 경로를 일치시키는 다른 방법(예: )이 있을 수 있지만 이것이 패턴에 나타날 수 있는 /usr/share/man/유일한 위치는 아닙니다 ./

답변1

그냥 /testregexp/로 바꾸세요$0 ~ "testregexp"

간단한 예:

$ echo "a/b/c" | awk ' ( $0 ~ "a/b/c" ) { print "we have a winner" ; }'
we have a winner

다른 예시

regexp='some regexp "with /lots/ of double quotes" "everywhere"'
awk -v reg="${regexp}" ' ( $0 ~ reg ) { action here... }'

답변2

awk 자체에는 간단하고 간단한 솔루션이 없습니다. 일반적으로 Perl로 전환(또는 sed간단한 작업을 위해 Perl로 전환)하는 것이 일반적인 해결 방법입니다.

관련 정보