我有一个脚本
#! /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
其中$1
应该是awk
(GNU 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}) }