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',但是无论您喜欢什么都可以。
它应该适合你:
sed -e '/Security-Start/{ N; s/Security-Start.*Security-End/REDACTED/ }'
Run Code Online (Sandbox Code Playgroud)
/Security-Start/ 搜索“安全启动”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)
在这里阅读
如果文件不是太大,那么您可以在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在未成功的替换)。