正则表达式找到完全有一个管道字符的字符串

时间:2013-09-20 02:42:27

标签: regex grep

我是使用正则表达式的新手,希望有人可以帮助我。 我正在使用下面的正则表达式来grep csv文件中的字符串,它具有一个管道符(即|)

grep "^([^\\|]+\\|){1}[^\\|]+$" myfile.csv

不幸的是,当与grep一起使用时,上面的结果没有结果。有什么想法吗?

示例csv文件内容如下所示,我希望找到第二行。

"foo"|"foo"|"foo"

"bar"|"bar"

此问题的解决方案:

grep -E "^([^|]+\|){1}[^|]+$" myfile.csv

egrep "^[^|]+\|[^|]+$" myfile.csv

5 个答案:

答案 0 :(得分:4)

您可以尝试:

^[^|]*\|[^|]*$

您不需要在字符类中转义|。此外,您可能希望*而不是+来支持|abcxyz||这样的字符串。

答案 1 :(得分:1)

尝试以下方法:

^[^|]+\|[^|]+$

答案 2 :(得分:1)

使用awk

的解决方案
awk 'gsub(/\|/,"|")==1' file

gsub(/\|/,"|")这会计算|已替换的数量,如果相等1,则执行默认操作,print $0

编辑:另一个awk:

awk 'split($0,a,"|")==2' file

如果|打印,请计算2分发的文字部分数量。

答案 3 :(得分:0)

以下是我的问题的解决方案。感谢这些评论让我解决了这个问题。

grep -E "^([^|]+\|){1}[^|]+$" myfile.csv

egrep "^[^|]+\|[^|]+$" myfile.csv

答案 4 :(得分:0)

Grep和正则表达式是完成此任务的错误工具。使用用于计数的东西:

# Use a split function with the pipe as delimiter
awk 'split($0, _, "|") == 2 {print}' the_file

# Set awk's field separator to the pipe character
# and check the number of fields on each line
awk -F'|' 'NF == 2 {print}' the_file