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

Regex awk gsub正则表达式,不在双引号中匹配单词,regex,unix,awk,Regex,Unix,Awk,我编写了一个正则表达式,试图用gsub和awk替换每个出现在双引号之外的单词。然而,即使这个表达式可以与在线计算器一起使用,这个表达式也不能替代我脚本中的任何内容 输入= studentNum==“00000”{print name,“是教授”} 表达方式: gsub(“studentNum(?=[^”]*(?:“[^”]*“[^”]*)*$),“XXX”,输入) 预期产出: XXX==“00000”{print name,“是教授”}与匹配函数:awk不支持前瞻机制,请使用显示的示例尝试以下操

我编写了一个正则表达式,试图用gsub和awk替换每个出现在双引号之外的单词。然而,即使这个表达式可以与在线计算器一起使用,这个表达式也不能替代我脚本中的任何内容

输入=

studentNum==“00000”{print name,“是教授”}

表达方式:

gsub(“studentNum(?=[^”]*(?:“[^”]*“[^”]*)*$),“XXX”,输入)

预期产出:


XXX==“00000”{print name,“是教授”}

匹配
函数:
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
解释:简单的解释是:在这里使用
awk
match
函数来匹配studentNum==“digits”{直到这里的行尾。然后用匹配值中的
XXX=
替换从开始到第一次出现的
的所有内容,然后打印匹配值

奖金解决方案(带匹配):如果您有不匹配条件的行,并且您希望同时打印匹配条件行和不匹配条件行,请尝试以下操作:

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

在线regexp验证器只能证明您的regexp与特定的在线regexp验证器一起工作,但不能证明它与任何给定的命令行工具一起工作。特别是,您的regexp是一个PCRE,而sed默认支持BRE,awk支持ERE。没有支持PCRE的强制POSIX工具

这就是你想做的吗

$ sed 's/studentNum\(=="[^"]*"\)/XXX\1/' file
XXX=="00000"{print name, "is the prof"}

$ awk '{print gensub(/studentNum(=="[^"]*")/,"XXX\\1",1)}' file
XXX=="00000"{print name, "is the prof"}

sed脚本将在任何sed中工作,awk脚本需要具有gensub()的awk,例如GNU awk。

您的regexp似乎试图在双引号中替换单词之前的单词,而不是每个出现在双引号中的单词。如果要替换每个出现在双引号中的单词,您应该在示例输入/输出中包含该单词的双引号示例。