如何用sed/awk高效批量处理含util.exe的行,实现特定格式注释转换?
高效的单工具实现方案
方案一:awk(推荐,逻辑更清晰)
直接用awk单命令完成匹配、字段提取和格式化,避免多工具联动的进程开销,处理大量文件时效率提升明显:
awk '/util.exe/ { params = $(NF-1) " " $NF # 从$2里剥离出util.exe($2对应示例里的$ENV\util.exe) sub(/.*\\/, "", $2) print "###mytag###" $2 "###" params "### " $0 }' inputfile
关键逻辑说明:
/util.exe/:只筛选包含util.exe的行$(NF-1) " " $NF:直接取行内最后两个字段,拼接成参数串sub(/.*\\/, "", $2):去掉$ENV\util.exe里反斜杠及之前的内容,得到纯util.exe- 最后按要求格式拼接,把原行内容
$0追加在末尾
方案二:sed(纯正则处理)
如果偏好sed,用扩展正则的捕获组也能实现:
sed -E '/util.exe/ s/^(.*\\)(util\.exe)(.* )([^ ]+) ([^ ]+)$/###mytag###\2###\4 \5### \0/' inputfile
关键逻辑说明:
-E:启用扩展正则,减少转义字符的冗余- 正则通过5个捕获组分别提取:
util.exe前的所有内容(如$CmdVar $ENV\)- 目标字符串
util.exe util.exe到最后两个参数之间的内容- 倒数第二个参数
- 最后一个参数
- 替换时用
\2、\4、\5调用捕获到的内容,\0代表原行完整内容
为什么比原方案高效?
原方案串联了grep、awk、tr、while循环多个工具,每一步都要启动新进程,而且循环逐行处理的IO开销大。上面的单awk/sed命令都是单进程遍历文件一次就完成所有操作,处理大量文件时速度优势非常明显。
内容的提问来源于stack exchange,提问作者Mister Claret
相关产品推荐
相关产品推荐

