【问题标题】:Regex for lines containing an odd number of pipe characters包含奇数个管道字符的行的正则表达式
【发布时间】:2013-05-23 23:07:26
【问题描述】:

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

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

原则上,我知道该怎么做,但是我尝试了以下正则表达式命令,但没有成功。

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

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

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

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

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

没有一行匹配。

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

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

【问题讨论】:

  • gsub()一对管道然后看看还有没有?

标签: regex sed awk grep pattern-matching


【解决方案1】:

script.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

【讨论】:

    【解决方案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)'
    

    输出:

    【讨论】:

    • 我认为你有它倒退。这仅匹配具有偶数个管道的行。
    【解决方案3】:

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

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

    【讨论】:

    • print if y/|// % 2 更惯用,可能更快。
    【解决方案4】:

    怎么样:

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

    示例:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-20
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        相关资源
        最近更新 更多