如何在不同行的两个模式之间替换文本?

Arr*_*cal 6 command-line text-processing

我有几个需要替换文本的文件。文本每次都以相同的模式开始和结束,但模式之间的内容是可变的。图案可以出现在行的中间,它们之间的内容往往跨越多行。

每个文件中只会出现一次开始和结束模式。

我需要一个命令行方法来替换模式之间的文本,包括模式本身。输出到新文件或就地编辑都可以。

对单个文件进行操作的命令将起作用,因为我可以遍历文件并自己应用该命令。我尝试了一个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...
Run Code Online (Sandbox Code Playgroud)

开始模式是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...
Run Code Online (Sandbox Code Playgroud)

请注意,两个模式之间的文本可能很长,跨越几行,长度相当随机。这在上面的例子中并不清楚

Ubuntu 系统上默认可用的任何语言都可以。我的第一个想法是 'sed' 或 'awk',但是无论您喜欢什么都可以。

Rav*_*ina 8

它应该适合你:

sed -e '/Security-Start/{ N; s/Security-Start.*Security-End/REDACTED/ }'
Run Code Online (Sandbox Code Playgroud)
  • /Security-Start/ 搜索“安全启动”
  • 如果你找到了:“N;” 表示追加下一行。
  • s/Security-Start.*Security-End/REDACTED/在最终结果中进行替换。

对于超过两行,请使用这一行:

sed -n '1h; 1!H; ${ g; s/Security-Start.*Security-End/REDACTED/p }'
Run Code Online (Sandbox Code Playgroud)

在这里阅读


ste*_*ver 8

如果文件不是太大,那么您可以在slurp 模式下使用 perl :

$ perl -0777 -pe 's/Security-Start.*Security-End/REDACTED/s' file 
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...
Run Code Online (Sandbox Code Playgroud)

-0777命令行参数有效时清除记录分隔,使整个文件咕噜咕噜。该s正则表达式改性剂原因Perl来包括在换行字符.,使得跨系中的表达匹配。


或者,使用 sed 循环:

$ sed '/Security-Start/ {:a; $!N; s/Security-Start.*Security-End/REDACTED/; t; ba}' file
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...
Run Code Online (Sandbox Code Playgroud)

随着GNU sed的,可以更换t; ba(分支出来的成功的更换;(否则)分支:a)由Ta(分公司:a成功的替换)。