与Awk中的gensub匹配的字符串

与Awk中的gensub匹配的字符串,awk,Awk,我试图回答这里提出的问题 我试着 awk '{ print gensub(/[([0-9]+.[0-9]+) - ([0-9]+.[0-9]+)]/,"\\1","g")}' 但它不起作用,我不明白为什么。请告知 提供的输入: 10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,"[1.1 - 3.0]","[0.384 - 0.768]" 期望输出: 10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,1.1,0.38

我试图回答这里提出的问题

我试着

awk  '{ print gensub(/[([0-9]+.[0-9]+) - ([0-9]+.[0-9]+)]/,"\\1","g")}'
但它不起作用,我不明白为什么。请告知

提供的输入:

10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,"[1.1 - 3.0]","[0.384 - 0.768]"
期望输出:

10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,1.1,0.384

方括号是元字符。如果你想匹配它们,你需要逃离它们

注意针对性问题的Harvery解决方案,以及方括号是如何转义的。相反,您的awk代码不包含转义括号

这应该行得通

awk  '{ print gensub(/\[([0-9]+.[0-9]+) - ([0-9]+.[0-9]+)\]/,"\\1","g")}'

您已经将括号表达式与
[0-9]
一起使用,因此显然您知道
[…]
在regexp中的含义。现在看看您编写的regexp:

[([0-9]+.[0-9]+) - ([0-9]+.[0-9]+)]
请注意,开头和结尾字符用于定义括号表达式,特别是第一个匹配对(regexp中的第二个
[
仅是第一个括号表达式中的文字
[
字符):

请注意,最后一个
]
不是终止括号表达式,因此它已经只是一个文本
]
字符,不需要转义

还请注意,
s是与任何单个字符匹配的regexp元字符,当您确实希望按字面意思处理它们时,根据您的预期输出,您不希望保留双引号,因此您的代码应该是:

$ awk  '{ print gensub(/"\[([0-9]+\.[0-9]+) - ([0-9]+\.[0-9]+)]"/,"\\1","g")}' file
10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,1.1,0.384
这是一个sed版本

$ sed -r '{ s#"\[([0-9.]*)[^"]*"#\1#g }'

10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,1.1,0.384

我有相同的输入和输出,我执行了上面的命令,但我没有替换任何东西,只是在输出中打印了输入(输出字符串与输入字符串相同),所以我认为我的命令没有做任何事情。我用输入和输出编辑了问题方括号是元字符。如果你想匹配它们,你需要逃离它们。注意针对性问题的Harvery解决方案,以及方括号是如何转义的。相反,您的
awk
代码不包含转义括号。@Alexandre N.关于这一点,它不应该既不是awk也不是awk,而是
awk
。见@fedorqui谢谢你的提示!感谢Ed,我之所以不想转义括号和.s,是因为我能够匹配grep表达式中的字符串。请看这个grep-o'[[0-9]\{1,\}.[0-9]\{1,\}-[0-9]\{1,\}.[0-9]\{1,\}'''我没有转义[and]但它与我要替换的字符串相匹配,所以我认为相同的表达式也适用于awk。为什么会有这样的差异?或者我又错过了一些东西。当在
([foo]bar)
上下文中使用时,您的grep regexp不包含用于标识捕获组/regexp子表达式的圆括号,但当用作
[(foo]bar)时,标识可选的文本
,后跟所需的文本
正如您在错误指定的awk regexp中所做的那样。希望你明白,你仍然需要做我建议的逃避,以避免错误的匹配。
$ sed -r '{ s#"\[([0-9.]*)[^"]*"#\1#g }'

10368,"Verizon DSL",DSL,NY,NORTHEAST,-5,-4,1.1,0.384