与Awk中的gensub匹配的字符串

时间:2017-01-18 18:37:01

标签: awk

我试着回答这里提出的问题 How to replace a string like "[1.0 - 4.0]" with a numeric value using awk or sed?

我试过

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

3 个答案:

答案 0 :(得分:1)

您已经在[0-9]使用了括号表达式,所以很明显您知道[...]在正则表达式中的含义。现在看看你写的正则表达式:

[([0-9]+.[0-9]+) - ([0-9]+.[0-9]+)]

并注意在哪里打开[和关闭]字符来定义括号表达式,特别是第一个匹配对(正则表达式中的第二个[只是一个文字{{ 1}}第一个括号表达式中的字符):

[

并注意到最后一个[([0-9] +. [0-9] +) - ( [0-9] +. [0-9] +)] 并未终止括号表达式,因此它只是一个文字]字符,并且不需要转义。

另请注意,]是匹配任何单个字符的正则表达式元字符,当您真正希望它们按字面处理时,根据您的预期输出,您不希望保留双引号,因此您的代码应该是:

.

答案 1 :(得分:0)

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

在尖锐的问题中注意Harvery的解决方案以及如何转义方括号。相反,您的awk代码不包含转义括号。

这应该有效

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

答案 2 :(得分:0)

这是一个sed版本

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

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