我试着回答这里提出的问题 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
答案 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