RegEx,替换可变数量的替换

RegEx, Substituting a variable number of replacements

希望我遗漏了一些明显的东西。

我有一个包含以下几行的文件:

| A | B | C |
|-----------|
Ignore this line
| And | Ignore | This |
| D | E | F | G |
|---------------|

我想找到 |----| 行,删除那些...并用前一行中的 ^ 替换所有 | 字符。例如

^ A ^ B ^ C ^
Ignore this line
| And | Ignore | This |
^ D ^ E ^ F ^ G ^

到目前为止我有:

perl -0pe 's/^(\|.*\|)\n\|-+\|//mg'

这需要来自标准输入的输入(sed 已经发生了一些其他修改)...并且它使用 -0/m 来支持多行替换。

匹配似乎是正确的,它删除了 |----| 行,但我看不出如何用 [= 替换 |^ 22=](或</code>)反向引用。</p> <p>我不记得我以前在哪里做过,但另一种语言允许我使用 <code>${1/A/B} 将 A 替换为 B,但这让 perl 很沮丧。

我一直想知道这里是否可以使用 /e/ee,但我对 perl 不太熟悉如何使用。

您可以使用

perl -0pe 's{^(.*)\R\|-+\|$\R?}{ =~ s,\|,^,gr}gme' t

详情:

  • ^(.*)\R\|-+\|$\R? - 匹配所有出现的地方(见末尾的 g 标志)
    • ^ - 行首(注意 m 标志使 ^ 匹配行首,$ 匹配行尾)
    • (.*) - 第 1 组:整行
    • \R - 换行序列
    • \| - | 字符
    • -+ - 一个或多个 - 个字符
    • \| - 一个 | 字符
    • $ - 行尾
    • \R? - 一个可选的换行序列。

一旦找到匹配项,所有 | 都将使用 =~ s,\|,^,gr 替换为 ^,这会替换第 1 组值中的值。此语法通过 e 标志启用。

我可以看到这是使用 2 个替换完成的:

\|(?=.*[\r\n]+\|-+\|$)

https://regex101.com/r/x7d15d/1/

然后:

^\|-+\|(?:[\r\n]+|$)

https://regex101.com/r/ZdEzuM/1/

使用一种模式检查前瞻断言中的下一行:

perl -0pe 's/\|(?=.*\R\|-+\|$)(?:\R.*)?/^/gm' file

如果你绝对想使用评价,你可以用这种模式在替换部分加上音译:

perl -0pe 's#^(.*)\R\|-+\|$#=~y/|/^/r#gme' file