我正在尝试使用 awk 将第一个字段中最后一次出现的句点替换为分号。字段分隔符也是分号。
我(\.)(?!.*\1)
在 regex101.com 上作为正则表达式进行了测试,当我提供“abcmp3”作为输入时,它正确地突出显示了句点的最后一次出现。
我在 awk 中尝试了以下操作:
awk 'BEGIN{FS=OFS=";"} {gsub(/(\.)(?!.*\1)/, ";", $1)} 1'
它不会取代任何东西。
我将不胜感激任何可以提供帮助的人。
我正在尝试使用 awk 将第一个字段中最后一次出现的句点替换为分号。字段分隔符也是分号。
我(\.)(?!.*\1)
在 regex101.com 上作为正则表达式进行了测试,当我提供“abcmp3”作为输入时,它正确地突出显示了句点的最后一次出现。
我在 awk 中尝试了以下操作:
awk 'BEGIN{FS=OFS=";"} {gsub(/(\.)(?!.*\1)/, ";", $1)} 1'
它不会取代任何东西。
我将不胜感激任何可以提供帮助的人。
AFAIK,没有 awk 的实现支持像
(?!re)
.在 GNU awk(又名 gawk)中,使用gensub函数,您可以贪婪地捕获句点之前的所有内容,并在替换中将其反向替换:
可移植地,您可以改为使用match函数,再次使用贪婪匹配,然后挑选句点前后的子字符串:
使用 GNU awk,您可以(再次不可移植地)
match
通过其可选数组参数使用捕获和反向替换:由于先行是 perl 兼容的,您当然可以使用 perl(尽管可能没有捕获和向后引用
\.
,这在任何情况下都显得过大):Miller具有类似 awk 的功能,
sub
并且gsub
与 GNU awk 一样gensub
,支持捕获和反向引用:据我所知,它目前不支持环视。
怎么样
sed
?在您的情况下,您很幸运能够在字段 1 上工作: