首页 > 解决方案 > sed -i '/$(command 1)/$(command 2)/' myHtmlFile ? 使用 sed 和 awk 进行内联编辑

问题描述

我正在编写一个 shell 脚本,它构建和编辑一个 html 文件,其主要内容基本上是 clamscan (ClamAV) 的输出。所以,脚本的任务是:翻译输出,删除无用的东西,添加 html 标签等等。虽然,我坚持我想要的最后一次修改。

来自clamscan 的编辑输出的一部分如下所示:

/path/to/infected-file: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>
/path/to/infected-zipfile!(1)ZIP:eicar.com: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>
/path/to/infected-zipfilewithinzipfile!ZIP:eicar_com.zip!(2)ZIP:eicar.com: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>

我想缩小那些长线。像这样的东西是最好的:

infected-file: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>
infected-zipfile: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>
infected-zipfilewithinzipfile: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>

但我已经很乐意删除受感染文件的路径。

由于使用 awk 似乎很容易获得一些结果,并且我在之前的所有编辑中都使用了 sed,所以我认为我最好的选择是: sed -i 's/<awk command 1>/<awk command 2>/' myHtmlFile

不幸的是,我花了几个小时以各种方式转动它,但没有运气。

似乎存在以下语法问题:

sed "s#$(awk -F': ' '{print $1}' testfile)#$(awk -F': ' '{print $1}' testfile | awk -F'\' '{print $NF}')#" testfile

无论我使用单引号还是双引号,我是否尝试连接 sed 字符串或尝试根据所选语法转义各种字符。

我也考虑过循环(这样我就可以使 sed 与包含 awk 结果的变量一起工作),但我不确定如何管理这种内联编辑的循环。它可能可以用一个强大的正则表达式来解决,但我很不擅长它^^

标签: regexbashawksed

解决方案


$ sed -E 's#[^:]+/([^:!]+).*: #\1: #' file
infected-file: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>
infected-zipfile: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>
infected-zipfilewithinzipfile: Eicar-Test-Signature<span class="mep-subhead-warning"> FOUND</span>

上面的正则表达式这样做:

  1. [^:]+/- 使用不包含冒号且以 结尾的前导字符串/,例如/path/to/
  2. ([^:!]+)- 在捕获组中保存不包含冒号或感叹号的后续字符串,例如infected-zipfile
  3. .*:- 使用以冒号开头的后续字符串,后跟一个空白字符,例如!(1)ZIP:eicar.com:.

然后替换这样做:

  1. \1- 打印上面步骤 2 中保存到捕获组 1 中的字符串
  2. :- 打印一个冒号后跟一个空白字符(我也可以为此使用捕获组)

推荐阅读