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]+|$)
使用一种模式检查前瞻断言中的下一行:
perl -0pe 's/\|(?=.*\R\|-+\|$)(?:\R.*)?/^/gm' file
如果你绝对想使用评价,你可以用这种模式在替换部分加上音译:
perl -0pe 's#^(.*)\R\|-+\|$#=~y/|/^/r#gme' file
希望我遗漏了一些明显的东西。
我有一个包含以下几行的文件:
| 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]+|$)
使用一种模式检查前瞻断言中的下一行:
perl -0pe 's/\|(?=.*\R\|-+\|$)(?:\R.*)?/^/gm' file
如果你绝对想使用评价,你可以用这种模式在替换部分加上音译:
perl -0pe 's#^(.*)\R\|-+\|$#=~y/|/^/r#gme' file