1

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

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

不幸的是,上面的内容在与 grep 一起使用时不会产生任何结果。有任何想法吗?

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

"foo"|"foo"|"foo"

"bar"|"bar"

这个问题的解决方案:

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

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

5 回答 5

4

你可以试试:

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

您不需要|在字符类中转义。此外,您可能希望*而不是在+这里允许像|abc,xyz|和单独的字符串|

于 2013-09-20T02:45:44.310 回答
1

尝试以下操作:

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

于 2013-09-20T02:47:08.067 回答
1

解决方案使用awk

awk 'gsub(/\|/,"|")==1' file

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

编辑:另一个awk:

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

计算有多少部分文本被|, 如果2打印。

于 2013-09-20T08:15:47.733 回答
0

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

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

egrep "^[^|]+\|[^|]+$" myfile.csv
于 2013-09-20T13:21:16.457 回答
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
于 2013-09-20T19:15:15.667 回答