我有几个需要替换文本的文件。文本每次都以相同的模式开始和结束,但模式之间的内容是可变的。图案可以出现在行的中间,它们之间的内容往往跨越多行。
每个文件中只会出现一次开始和结束模式。
我需要一个命令行方法来替换模式之间的文本,包括模式本身。输出到新文件或就地编辑都可以。
对单个文件进行操作的命令将起作用,因为我可以遍历文件并自己应用命令。我尝试了一个sed
解决方案,但只能设法替换整行。
文本的一个例子是:
Cable Type ID:135, Installation ID:62, Alpha Conductor Origin:
Tolerance Report B74 - 3rd June 1996, Beta Conductor Origin:
Tolerance Report B74 - 3rd June 1996, Phase Conductor Size:
45mm, Security: Security-Start Bs86gKI-734Lw#32_nP/5589Zfb8Wj-
sW93j9b Security-End, Location ID:889, Protective Earth Size:
67mm, Protective Earth Max Current (A): 4, Overload Time...
开始模式是Security-Start
,结束模式是Security-End
。我想用单词替换模式和所有内容REDACTED
。
我希望输出为:
Cable Type ID:135, Installation ID:62, Alpha Conductor Origin:
Tolerance Report B74 - 3rd June 1996, Beta Conductor Origin:
Tolerance Report B74 - 3rd June 1996, Phase Conductor Size:
45mm, Security: REDACTED, Location ID:889, Protective Earth Size:
67mm, Protective Earth Max Current (A): 4, Overload Time...
请注意,两种模式之间的文本可能很长,以至于跨越了几行,它的长度是相当随机的。这在上面的例子中不清楚
任何在 Ubuntu 系统上默认可用的语言都可以。我的第一个想法是“sed”或“awk”,但无论你喜欢什么都可以。
它应该适合你:
/Security-Start/
搜索“安全启动”s/Security-Start.*Security-End/REDACTED/
并在最终结果中进行替换。对于多于两行的情况,请使用这一行:
在这里阅读
如果文件不是太大,那么您可以在slurp 模式下使用 perl :
命令行
-0777
参数有效地取消设置记录分隔符,以便整个文件被吞食。regex 修饰符使 perl在s
中包含换行符.
,使表达式跨行匹配。或者,使用 sed 循环:
使用 GNU sed,您可以将
t; ba
(branch out on successful replacement; (否则) branch to:a
)替换为Ta
(branch to:a
on unsuccessreplace )。更手动的方法是将输入文件中的所有换行符替换为 NULL,使用简单的
perl
非贪婪正则表达式进行替换,然后将换行符放回原处:以下是使用 awk 的方法: