我正在清理一个LaTeX文件,而我正处于需要区分绝对值的情况下| x |从集合“这样”的符号,即{x | x< 0}。
我的第一步是查找包含奇数个|的所有行字符(即管道符号)。
原则上,我知道如何做到这一点,但我已经尝试了以下正则表达式命令而没有运气。
egrep '^[^\|]*\|([^\|]*\|[^\|]*\|)*[^\|]*$'
这个想法是匹配的行按顺序包含:
然而,由于某种原因,这是行不通的。 我在以下文件上运行命令:
\[
S = \{ x | x < 0}
y = |x|
\]
并且没有一行匹配。
我怀疑我在某个地方犯了一个愚蠢的错误,可能与逃脱管道角色有关, 但是我很难过是什么问题。
有人可以告诉我如何解决这个问题,或者提供一个替代表达式来匹配包含奇数个管道字符的行吗?
答案 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'文件