首页 > 解决方案 > awk gsub 正则表达式,匹配单词不在双引号中

问题描述

我编写了一个正则表达式来尝试使用 gsub 和 awk 替换每个不在双引号中的单词。然而,即使该表达式适用于在线计算器,该表达式也不会替换我脚本中的任何内容。

输入 =

studentNum=="00000"{print name, "is the prof"}

表达:

gsub( "studentNum(?=[^"]*(?:"[^"]*"[^"]*)*$)", "XXX", input)

预期输出:

XXX=="00000"{print name, "is the prof"}

标签: regexunixawk

解决方案


match功能:awk不支持前瞻机制,您展示的示例请尝试以下。

awk '
match($0,/^studentNum=="[0-9]+"{.*}$/){
  val=substr($0,RSTART,RLENGTH)
  sub(/^[^"]*/,"XXX==",val)
  print val
}
'  Input_file

match功能:

awk '
/^studentNum=="[0-9]+"{.*}$/{
  sub(/^[^"]*/,"XXX==")
}
1
'  Input_file

解释:简单的解释是:使用match函数awk来匹配 studentNum=="digits"{ 直到行尾。"然后用替换从开始到第一次出现的所有内容XXX==,然后打印匹配值。

奖励解决方案(匹配):如果您有不匹配条件的行,并且您想打印匹配条件和不匹配两行,请尝试以下操作:

awk '
match($0,/^studentNum=="[0-9]+"{.*}$/){
  val=substr($0,RSTART,RLENGTH)
  sub(/^[^"]*/,"XXX==",val)
  $0=val
}
1
'  Input_file

推荐阅读