awk에서 일치하는 텍스트에 대한 역참조

awk에서 일치하는 텍스트에 대한 역참조

awk (GNU Awk 4.2.0) input 에서 {with \{, [with \[|with 와 같은 일부 문자를 이스케이프 처리해야 합니다 \|. 나는 세 가지 호출을 통해 gsub이를 달성했습니다 .

for (i = 2; i <= NF; i++) {
    gsub(/{/, "\\{", $i)
    gsub(/\[/, "\\[", $i)
    gsub(/\|/, "\\|", $i)
}

이 세 가지 호출을 하나로 결합하려면 어떻게 해야 합니까? 그것은 마치

gsub(/([{[|])/, "\\\1", $i)

답변1

&일치하는 텍스트를 참조하기 위해 대체에 사용할 수 있습니다.:

$ awk '{gsub(/[[{|]/, "\\\\&", $0); print}' <<<"abc { | [ def"
abc \{ \| \[ def

이는 [...]패턴에 [, 및 를 포함하는 일반 문자 클래스 |이며 완전히 이스케이프된 백슬래시와 교체가 뒤따릅니다. 당신은 정말로 그들 모두가 필요합니다.{&


더 복잡한 패턴의 경우gawk에는 gensub기능이 있습니다예를 들어 텍스트의 일부를 인용할 수 있지만 \\1여기서는 필요하지 않습니다. 모든 POSIX 규정은 대체 항목에 일치하는 전체 하위 문자열을 포함하는 동작을 awk지원합니다 .&

답변2

OP는 아마도 $1이를 방지하고 싶어할 것입니다.

echo; 
( 
  mawk '{ gsub(/[[{|]/, "\\\\&", $0); print}'    <<<"a[b{c { | [ def";

  mawk '$(((__=$!_)gsub("[[{|]","\\\\&"))~_)=__' <<<"a[b{c { | [ def" \

) | gcat -n | lgp3 


 1  a\[b\{c \{ \| \[ def

 2  a[b{c \{ \| \[ def

따라서 모든 것을 반복하는 대신 $2 to $NF원본의 복사본을 저장하고 전체 행을 $1처리 gsub()한 다음 다시 넣습니다.

원본을 첫 번째 필드에 다시 넣는 것의 추가 이점은 $1마치 이미 완료된 것처럼 $1=$1대체 항목에 관계없이 해당 줄이 인쇄되도록 보장한다는 것입니다.

관련 정보