【问题标题】:How to substitude / delete multiple lines inplace?如何替换/删除多行?
【发布时间】:2019-06-08 20:54:17
【问题描述】:

我想在基于 debian 的系统上使用 find . -name *.php -exec COMMAND {} \; 来删除这样的模式:

<?php
#bVj7Gt#
line1
...
lineX
#/bVj7Gt#
?>

&lt;?php 之后的行 = 哈希 + 六个字母数字 + 哈希

?&gt; 之前的行 = 哈希 + 斜杠 + 六个字母数字 + 哈希

【问题讨论】:

  • 欢迎来到 StackOverflow!这个网站是关于帮助人们修复他们的代码的。这不是免费的编码服务。任何代码都比没有代码好。即使您不知道如何编写解决方案,元代码甚至会展示您认为程序应该如何工作。鉴于您包含的标签,我希望在您的问题中看到 bash、perl、awk 和 sed 代码。查看how-to-ask,在MCVE 中向我们展示您迄今为止所做的工作,您所期望的结果和您得到的结果,我们将帮助您解决问题。
  • 我在 sed 和 awk 中使用以下正则表达式 &lt;\?php\n\#[a-zA-Z0-9]{6}\#.*\?&gt; 进行了尝试,但没有得到有效的解决方案。
  • sedawk 只能逐行工作,因此多行正则表达式不会在那里轻松工作。你可以试试 Perl:perl -0777 -i.bak -wple 's/&lt;\?php\s+#(\w{6})#.*?\s+#\1#\s+\?&gt;//msg'
  • 内线有没有可能出现“?>”?
  • @Corion 不,awk 逐条记录,而不是逐行工作,因此 awk 可以与多行正则表达式一起使用。 sTealth 请edit您的问题包括简洁、可测试的样本输入(不仅仅是您要从该输入中删除的块)和预期输出,以便我们为您提供帮助。

标签: bash perl unix awk sed


【解决方案1】:

这可能是也可能不是您正在寻找的(因为您没有提供我们可以测试的示例输入/输出)使用 GNU awk 进行多字符 RS:

$ cat file
foo
<?php
#bVj7Gt#
line1
...
lineX
#/bVj7Gt#
?>
bar

$ awk -v RS='<[?]php\n#[[:alnum:]]{6}#.*#/[[:alnum:]]{6}#\n[?]>\n' -v ORS= '1' file
foo
bar

如果您想进行“就地”编辑,请将其设为 awk -i inplace -v RS=...

【讨论】:

  • 它对我有用 perl -0777 -i.bak -wple 's/&lt;\?php\r\n\#[a-zA-Z0-9]{6}\#.*\?&gt;//msg' file 非常感谢您的帮助 Ed 和 Corion。
  • 我现在也用 awk 尝试过,它适用于 awk -v RS='&lt;[?]php\r\n#[[:alnum:]]{6}#.*#/[[:alnum:]]{6}#\r\n[?]&gt;' -v ORS= '1' file 谢谢 Ed
猜你喜欢
  • 1970-01-01
  • 2015-03-15
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
相关资源
最近更新 更多