bash 변수를 gsub() 및 match()에 대한 정규식 인수로 사용하는 방법은 무엇입니까?

bash 변수를 gsub() 및 match()에 대한 정규식 인수로 사용하는 방법은 무엇입니까?

스크립트가 있습니다

#! /bin/bash
awk -v pat="$1" '{ if(match($0, pat)) {print $0} }' "$3"
awk -v pat="$1" -v rep="$2" '{gsub(pat, rep); print $0}' "$3"

이렇게 운영하고 싶어요

myscript '\.\.+' ' ' ./inputfile

(GNU awk)이 이해할 수 있는 정규 표현식 이어야 $1합니다 .awk

pat정규식으로 지정된 매개변수 gsub()match()아무 효과가 없습니다. 작동시키는 방법을 알고 싶습니다. 감사해요.

답변1

변수 전달에 관한 한, 귀하가 수행하는 방식은 정확합니다. 표현식이 작동하려면 다음이 필요합니다.이중 백슬래시,적어도 Gawk에서는:

myscript '\\.\\.+' ' ' ./inputfile

AWK 부분을 단순화할 수 있습니다.

#!/bin/bash
awk -v pat="$1" 'match($0, pat)' "$3"
awk -v pat="$1" -v rep="$2" '{gsub(pat, rep)} 1' "$3"

답변2

다른 접근 방식을 사용한 빠른 답변: Awk로 작성된 스크립트:

#!/usr/bin/gawk -f
BEGIN { find=ARGV[1]; repl=ARGV[2]; delete ARGV[1]; delete ARGV[2]}
      { print gensub(find,repl,"g",$0) }

그런 다음 일반적인 Unix 필터 동작은 다음과 같습니다.

$ chmod 755 myawkscript

$ ls |myawkscript '\w(.)' '{\1}'
{y}{w}{s}{r}{p}t

$ myawkscript '(\w+)' '{\1}' myawkscript 
#!/{usr}/{bin}/{gawk} -{f}
{BEGIN} { {find}={ARGV}[{1}]; {repl}={ARGV}[{2}]; ..... 
      { {print} {gensub}({find},{repl},"{g}",${0}) }

관련 정보