我是使用正则表达式的新手,希望有人可以帮助我。 我正在使用下面的正则表达式来grep csv文件中的字符串,它具有一个管道符(即|)
grep "^([^\\|]+\\|){1}[^\\|]+$" myfile.csv
不幸的是,当与grep一起使用时,上面的结果没有结果。有什么想法吗?
示例csv文件内容如下所示,我希望找到第二行。
"foo"|"foo"|"foo"
"bar"|"bar"
此问题的解决方案:
grep -E "^([^|]+\|){1}[^|]+$" myfile.csv
和
egrep "^[^|]+\|[^|]+$" myfile.csv
答案 0 :(得分:4)
您可以尝试:
^[^|]*\|[^|]*$
您不需要在字符类中转义|
。此外,您可能希望*
而不是+
来支持|abc
,xyz|
和|
这样的字符串。
答案 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