在Awk

时间:2017-01-15 07:30:41

标签: awk sed

我试着回答一个问题

How do I sed only matched grep line

如下

 awk -F":" -v M="Mary Jane" -v A="Runs" -v S="Sleeps" '{OFS=":" ; print gensub(/(M):(A)/,"\\1;S","g")}'

但它没有用,所以我猜gensub无法识别传递给awk的shell变量M,A和S,有没有办法在awk中使用gensub中的shell变量?

1 个答案:

答案 0 :(得分:1)

您遇到的不是因为您正在使用gensub(),而是因为它与regexp有关。有正则表达式文字,例如$0~/foo/,然后有动态regexp,它们是在评估它们时转换为regexp的字符串,例如$0~"foo"{var="foo"} $0~var。如果你想在 ANY regexp上下文中使用一个变量,那么你需要一个动态regexp,这就是你需要使用的语法,而不是regexp文字语法。请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Computed-Regexps

您所写内容的正确语法是:

awk -F":" -v M="Mary Jane" -v A="Runs" -v S="Sleeps" '{OFS=":" ; print gensub("("M"):"A,"\\1;"S,"g")}'

但是这有一些语义问题(例如,部分匹配和设置OFS的每一行而不是一次,当它甚至从未使用过,几乎肯定不必要地使用"g"代替1以及为什么当你真正尝试对字符串进行完全匹配时,请使用正则表达式