Regex 正则表达式来查找正好有一个管道字符的字符串

Regex 正则表达式来查找正好有一个管道字符的字符串,regex,grep,Regex,Grep,我对使用正则表达式是新手,希望有人能帮我。 我正在使用下面的正则表达式将一个csv文件grep为正好有一个管道字符(即|)的字符串 不幸的是,当与grep一起使用时,上述方法不会产生任何结果。有什么想法吗 csv文件内容示例如下,我希望第二行可以找到 "foo"|"foo"|"foo" "bar"|"bar" 此问题的解决方案: grep -E "^([^|]+\|){1}[^|]+$" myfile.csv 及 您可以尝试: ^[^|]*\|[^|]*$ 在字符类中不需要转义|。另外,

我对使用正则表达式是新手,希望有人能帮我。 我正在使用下面的正则表达式将一个csv文件grep为正好有一个管道字符(即|)的字符串

不幸的是,当与grep一起使用时,上述方法不会产生任何结果。有什么想法吗

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

"foo"|"foo"|"foo"

"bar"|"bar"
此问题的解决方案:

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

您可以尝试:

^[^|]*\|[^|]*$
在字符类中不需要转义
|
。另外,您可能希望在这里使用
*
而不是
+
,以允许像
|abc
xyz |
这样的字符串,并且只需自己使用
|

您可以尝试:

^[^|]*\|[^|]*$
在字符类中不需要转义
|
。另外,您可能希望在这里使用
*
而不是
+
,以允许像
|abc
xyz |
这样的字符串,并且只允许它自己使用
|

尝试以下操作:

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

尝试以下操作:


^[^ |]+\\\\[^ |]+$
使用
awk的解决方案

awk 'gsub(/\|/,"|")==1' file
gsub(/\ \ \ \/,“\”)
这计算被替换的
的数量,如果这等于
1
,则执行默认操作,
打印$0

编辑:另一个awk:

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

如果
2
打印,则计算
|
将文本分成多少部分。

使用
awk解决方案

awk 'gsub(/\|/,"|")==1' file
gsub(/\ \ \ \/,“\”)
这计算被替换的
的数量,如果这等于
1
,则执行默认操作,
打印$0

编辑:另一个awk:

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

如果
2
print,请计算
|
将文本分成多少部分。

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

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


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

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


Grep和regex对于这个任务来说是错误的工具。使用用于计数的东西:

# 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

Grep和regex对于这个任务来说是错误的工具。使用用于计数的东西:

# 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


这正是正则表达式真正不应该用来做的事情:它们不擅长计数。您选择的语言/框架很可能有一个
str.count()
方法或函数;它当然有一个更合适的
str.find()
。@JoshCaswell我同意,如果使用这样的语言,这可能会更容易,但对于regex来说也很好(当然也有一些regex应用程序没有您建议的宿主语言)。如OP所示,她正在使用
grep
。您可能需要将
-E
标志指定为
grep
,以获得完全的“扩展”正则表达式支持。@Phrogz:用grep替换另一个更合适的工具非常简单。感谢您的回复!但这纯粹是为了让adhoc thingy(即仅限grep)在csv文件中查找有问题的条目。如果我在我的代码中使用它,我会做不同的事情。:)顺便说一句,非常感谢@Phrogz提供的
-E
提示以及@arshajii关于逃逸
的提示。这个现在很好用`grep-E“^([^ |]+\\\|){1}[^ |]+$”myfile.csv'这正是正则表达式真正不应该用来做的事情:它们不擅长计数。您选择的语言/框架很可能有一个
str.count()
方法或函数;它当然有一个更合适的
str.find()
。@JoshCaswell我同意,如果使用这样的语言,这可能会更容易,但对于regex来说也很好(当然也有一些regex应用程序没有您建议的宿主语言)。如OP所示,她正在使用
grep
。您可能需要将
-E
标志指定为
grep
,以获得完全的“扩展”正则表达式支持。@Phrogz:用grep替换另一个更合适的工具非常简单。感谢您的回复!但这纯粹是为了让adhoc thingy(即仅限grep)在csv文件中查找有问题的条目。如果我在我的代码中使用它,我会做不同的事情。:)顺便说一句,非常感谢@Phrogz提供的
-E
提示以及@arshajii关于逃逸
的提示。这个现在很好用`grep-E“^([^ |]+\\\\|){1}[^ |]+$”myfile.csv'谢谢,但我忘了在我的问题中使用的分组模式之前,我也尝试过该正则表达式模式。但是这个模式不会返回任何结果。不,
*
而不是
+
,因为没有要求它不以
@pguardiario开头或结尾,这是从来没有指定过的,因为初始OP的regex使用的是
+
重复操作符,我假设这就是他想要的。你还应该看看这个问题的解决方案:这是他文章的一部分。他正在使用
+
,您将看到我的答案在解决方案列表中,而所选答案不在;)因此,因为他的错误解决方案使用了
+
,您认为正确的解决方案必须使用
+
?很抱歉,这是一个软弱而怪异的论点。@pguardiario,你是谁,当OP自己编辑他的问题时,通过向他的问题添加工作解决方案来判断这是一个错误的解决方案,并注意这些使用了
+
运算符。我最初假设数据格式是严格的,不能包含空值,因为初始OP的正则表达式使用了
+
运算符,而您根据什么假设了相反的情况?很抱歉,但你似乎是在这里做出无效假设的人。你现在会用
*
否决其他答案吗?我希望不会。谢谢,但我忘了在我的问题中使用分组模式之前,我也尝试过这个正则表达式模式。但是这个模式不会返回任何结果。不,
*
而不是
+
,因为不需要