包含奇数个管道字符的行的正则表达式

时间:2013-05-28 20:44:46

标签: regex sed awk grep pattern-matching

我正在清理一个LaTeX文件,而我正处于需要区分绝对值的情况下| x |从集合“这样”的符号,即{x | x< 0}。

我的第一步是查找包含奇数个|的所有行字符(即管道符号)。

原则上,我知道如何做到这一点,但我已经尝试了以下正则表达式命令而没有运气。

egrep '^[^\|]*\|([^\|]*\|[^\|]*\|)*[^\|]*$'

这个想法是匹配的行按顺序包含:

  • 行开始
  • 0个或更多非管道字符
  • 正好一个竖线字符
  • 包含2个管道的0个或更多文本副本
  • 行结束

然而,由于某种原因,这是行不通的。 我在以下文件上运行命令:

\[
S = \{ x | x < 0}
y = |x|
\]

并且没有一行匹配。

我怀疑我在某个地方犯了一个愚蠢的错误,可能与逃脱管道角色有关, 但是我很难过是什么问题。

有人可以告诉我如何解决这个问题,或者提供一个替代表达式来匹配包含奇数个管道字符的行吗?

4 个答案:

答案 0 :(得分:2)

[]内,|不是特殊字符,因此不应由\转义。尝试:

egrep '^[^|]*\|([^|]*\|[^|]*\|)*[^|]*$'

答案 1 :(得分:2)

最好为此目的使用awk:

awk -F '|' '!(NF%2)'

<强>测试

echo "a|bc|d|erg" | awk -F '|' '!(NF%2)'

输出:

a|bc|d|erg

echo "abc|d|ergxy" | awk -F '|' '!(NF%2)'

输出:

答案 2 :(得分:1)

怎么样:

awk -F'|' 'NF&&(NF-1)%2' file

示例:

kent$  cat file
|foo|bar
| | | | |
||||||
|||||||

kent$  awk -F'|' 'NF&&(NF-1)%2' file
| | | | |
|||||||

答案 3 :(得分:1)

Perl,这是跨平台(Windows也是),并且通常在这些日子里安装,是我的选择:

perl -ne'打印if(s / \ | / \ | / g)%2 == 1'文件