스크립트가 있습니다
#! /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}) }