从多个文件中删除多行文本
Posted
技术标签:
【中文标题】从多个文件中删除多行文本【英文标题】:Deleting multiline text from multiple files 【发布时间】:2010-09-15 12:36:55 【问题描述】:我有一堆 java 文件,我想从中删除带有许可证的 javadoc 行 [正在更改我的代码]。
我正在寻找的模式是
^\* \* ProjectName .* USA\.$
但跨行匹配
sed [或 Windows/Linux 中常用的编辑器] 是否可以搜索/替换多行模式?
【问题讨论】:
【参考方案1】:可能有人仍在不时地寻找这样的解决方案。这是一个。
使用 awk 查找要删除的行。然后使用 diff 删除这些行并让 sed 清理。
awk "/^\* \* ProjectName /,/ USA\.$/" input.txt \
| diff - input.txt \
| sed -n -e"s/^> //p" \
>output.txt
警告说明:如果第一个模式存在而第二个不存在,您将丢失第一个模式下方的所有文本 - 因此请先检查。
【讨论】:
这看起来棒极了! .. 除了diff
是愚蠢的!如果您在文件中有 SSH2 密钥之类的模式,并且您正在尝试删除一个,请不要使用它。它将从文件顶部取一行,然后从其他地方取其余行。【参考方案2】:
是的。您是否使用 sed、awk、perl 或其他工具来解决此问题?
大多数正则表达式工具都允许您指定多行模式。请注意过于贪婪的正则表达式,否则它们会匹配 cmets 之间的代码(如果存在)。
这是一个例子:
/\*(?:.|[\r\n])*?\*/
perl -0777ne 'print m!/\*(?:.|[\r\n])*?\*/!g;' <file>
打印出所有运行的 cmets 一起。 (?: 符号必须是 用于非捕获括号。 / 不必逃避,因为! 分隔表达式。使用-0777 启用 slurp 模式和 -n 启用 自动阅读。
(来自:http://ostermiller.org/findcomment.html)
【讨论】:
【参考方案3】:这是我最喜欢的 sed 教程中的 appropriate reference point。
【讨论】:
以上是关于从多个文件中删除多行文本的主要内容,如果未能解决你的问题,请参考以下文章