【发布时间】:2019-09-24 01:46:11
【问题描述】:
如何表示 awk sub 或 gsub 的匹配字符串的多个部分。
对于像“##code”这样的正则表达式,如果我想在“##”和“code”之间插入一个单词,我想要一种类似VSCode语法的方式,其中$1代表第一部分,$2代表第二部分部分
sub(/(##)(code)/, "$1before$2", str)
从awk的用户手册中,我发现awk使用&来表示整个匹配的字符串。我怎样才能像VSCode一样表示匹配字符串中的一个,两个或多个部分。
sub(正则表达式,替换 [,目标]) 搜索目标,将其视为字符串,查找与正则表达式 regexp 匹配的最左侧、最长的子字符串。通过用替换替换匹配的文本来修改整个字符串。修改后的字符串成为目标的新值。返回替换的次数(零或一)。
正则表达式参数可以是正则表达式常量 (/.../) 或字符串常量 ("...")。在后一种情况下,字符串被视为要匹配的正则表达式。请参阅 Computed Regexps 讨论这两种形式之间的差异,以及正确编写程序的含义。
这个函数很特别,因为 target 不只是用来计算一个值,也不是任何表达式都可以——它必须是一个变量、字段或数组元素,以便 sub() 可以在其中存储修改后的值。如果省略此参数,则默认使用并更改 $0.48 例如:
str = "水,水,无处不在" 子(/at/,“我”,str) 通过用“ith”替换最左边出现的最长的“at”,将 str 设置为“wither, water, around”。
如果特殊字符“&”出现在替换中,它代表正则表达式匹配的精确子字符串。 (如果正则表达式可以匹配多个字符串,那么这个精确的子字符串可能会有所不同。)例如:
{ sub(/candidate/, "& and his wife"); print }在每个输入行中将第一次出现的“候选人”更改为“候选人和他的妻子”。这是另一个例子:
用户手册的链接是here
【问题讨论】:
-
您正在寻找
gensub -
是的! gensub 非常适合我的要求。谢谢你,oguz ismail。
-
请注意
gensub是 GNU awk 扩展。