修复通用sed多行模式匹配替换脚本执行失败问题
修复sed多行替换脚本中的未终止
s命令错误 问题重现
复现sliding-window式sed多行匹配替换技术时,执行blockrep.sed生成custom.sed时出现错误:
sed: file blockrep.sed line 19: unterminated `s' command
导致无法生成替换脚本,无法完成代码块替换。
错误原因分析
s命令格式不完整:脚本中第26行的1 s,^.,s/,使用逗号作为分隔符,但缺少结尾的分隔符,且匹配模式错误(不需要匹配首字符,只需在行首添加s/),导致sed认为命令未终止。- 正则字符集语法错误:第20行的
s,[/\[.*],\\&,g中,字符集内的[未正确转义,导致正则表达式语法非法,进一步加剧了命令未终止的问题。 - 另一处字符集错误:第41行的
s,[/\],\\&,g中,字符集未正确闭合,同样存在语法问题。
修复后的blockrep.sed脚本
#SOURCE: https://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq4_013.html # # filename: blockrep.sed # author: Paolo Bonzini # Requires: # (1) blocks to find and replace, e.g., findrep.txt # (2) an input file to be changed, input.file # # blockrep.sed creates a second sed script, custom.sed, # to find the lines above the row of 4 hyphens, globally # replacing them with the lower block of text. GNU sed # is recommended but not required for this script. # # Loop on the first part, accumulating the `from' text # into the hold space. :a /^###REPLACE_BY###$/! { # Escape slashes, backslashes, the final newline and # regular expression metacharacters. s,[/\\\[\].*+?^$(){}|],\\&,g s/$/\\/ H # # Append N cmds needed to maintain the sliding window. x 1 s/^/s\// 1! s/^/N\ / x n ba } # # Change the final backslash to a slash to separate the # two sides of the s command. x s,\\$,/, x # # Until EOF, gather the substitution into hold space. :b n s,[/\\],\\&,g $! s/$/\\/ H $! bb # # Start the RHS of the s command without a leading # newline, add the P/D pair for the sliding window, and # print the script. g s,/\n/,/, s,$/\ P\ D,p #---end of script---
关键修复点说明
- 将第20行的正则字符集修正为
s,[/\\\[\].*+?^$(){}|],\\&,g,正确转义所有需要处理的正则元字符(/、\、[、]、.、*等)。 - 将第26行的错误命令
1 s,^.,s/,改为1 s/^/s\//,用斜杠作为分隔符更清晰,实现在行首添加s/的逻辑,避免命令未终止问题。 - 将第41行的
s,[/\],\\&,g修正为s,[/\\],\\&,g,正确匹配/和\两个字符,避免字符集语法错误。
验证结果
修复后执行原bash脚本,将成功生成custom.sed,并完成Test_INPUT.cpp中目标代码块的替换,生成正确的Test_OUTPUT.cpp。
内容的提问来源于stack exchange,提问作者Eric Marceau
相关产品推荐
相关产品推荐

