Text-Processing

如何使用 bash 變數作為 gsub() 和 match() 的正則表達式參數?

  • November 13, 2018

我有一個腳本

#! /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

where$1應該是awk(GNU awk)可以理解的正則表達式。

指定為正則pat表達式作為參數將不起作用。我想知道我怎樣才能讓它工作?謝謝。gsub()``match()

就傳遞變數而言,您正在正確地處理事情。要使表達式起作用,您需要將反斜杠加倍至少使用 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"

只是用不同的方法快速回答:用 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}) }

引用自:https://unix.stackexchange.com/questions/481470