我试着回答一个问题
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变量?
答案 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
以及为什么当你真正尝试对字符串进行完全匹配时,请使用正则表达式