awk gsub 正则表达式,匹配不在双引号中的单词

Gav*_*ter 3 regex unix awk

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

输入 =

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

表达:

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

预期输出:

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

Rav*_*h13 6

match功能:awk不支持前瞻机制,请使用您显示的示例尝试以下操作。

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

match功能:

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

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

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

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