1

我正在清理一个 LaTeX 文件,我需要区分绝对值 |x| 来自集合“这样”的符号,即 {x | x < 0}。

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

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

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

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

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

但是,由于某种原因,这不起作用。我在以下文件上运行命令:

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

并且没有一条线匹配。

我怀疑我在某个地方犯了一个愚蠢的错误,可能与转义管道字符有关,但我不知道出了什么问题。

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

4

5 回答 5

2

里面[],|不是特殊字符所以不应该被\. 尝试:

egrep '^[^|]*\|([^|]*\|[^|]*\|)*[^|]*$'
于 2013-05-28T20:50:00.013 回答
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)'

输出:

于 2013-05-28T20:51:08.823 回答
1

怎么样:

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

例子:

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

kent$  awk -F'|' 'NF&&(NF-1)%2' file
| | | | |
|||||||
于 2013-05-28T20:53:28.237 回答
1

Perl,它是跨平台的(Windows 也是)并且现在普遍安装在任何地方,是我的首选:

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

于 2013-05-28T21:01:25.567 回答
0

脚本.sed

#!/bin/sed -nf

# Save to hold
h

# Delete all non | chars
s@[^|]@@g

# Odd match
/^\(||\)*|$/ {
  # Fetch hold
  g
  s@^@odd\t:@
}

# Even match
/^\(||\)\+$/ {
  # Fetch hold
  g
  s@^@even\t:@
}

# No match
/^$/ {
  # Fetch hold
  g
  s@^@none\t:@
}

# Print
p

数据.txt

do|odd
do|odd|match|me
|even match|me
do|even match|me
do|even match|also|me|please

no-match

sed -nf script.sed data.txt

标准输出

odd :do|odd
odd :do|odd|match|me
even    :|even match|me
even    :do|even match|me
even    :do|even match|also|me|please
none    :
none    :no-match
于 2022-01-06T20:50:41.937 回答