Regex 正则表达式来查找正好有一个管道字符的字符串
我对使用正则表达式是新手,希望有人能帮我。 我正在使用下面的正则表达式将一个csv文件grep为正好有一个管道字符(即|)的字符串 不幸的是,当与grep一起使用时,上述方法不会产生任何结果。有什么想法吗 csv文件内容示例如下,我希望第二行可以找到Regex 正则表达式来查找正好有一个管道字符的字符串,regex,grep,Regex,Grep,我对使用正则表达式是新手,希望有人能帮我。 我正在使用下面的正则表达式将一个csv文件grep为正好有一个管道字符(即|)的字符串 不幸的是,当与grep一起使用时,上述方法不会产生任何结果。有什么想法吗 csv文件内容示例如下,我希望第二行可以找到 "foo"|"foo"|"foo" "bar"|"bar" 此问题的解决方案: grep -E "^([^|]+\|){1}[^|]+$" myfile.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的正则表达式使用了+
运算符,而您根据什么假设了相反的情况?很抱歉,但你似乎是在这里做出无效假设的人。你现在会用*
否决其他答案吗?我希望不会。谢谢,但我忘了在我的问题中使用分组模式之前,我也尝试过这个正则表达式模式。但是这个模式不会返回任何结果。不,*
而不是+
,因为不需要