在! Heading 1与! Heading 2之间插入文本文件的代码问题排查
问题排查及修复方案
1. 首要致命错误:sed地址范围语法错误
你的sed语句中范围匹配写法完全不符合规范,原错误写法:sed '/! Heading 1,/! Heading 2/{//p;d;}' $file.txt > file-trimmed.txt
逗号被错误写到了第一个匹配模式的内部,会导致sed匹配不到目标标题行,删除逻辑完全失效。正确的范围匹配规则是两个模式用逗号分隔,修正后写法:sed '/! Heading 1/,/! Heading 2/{//p;d;}' "$file.txt" > file-trimmed.txt
2. 变量引用不规范问题
$file.txt没有加双引号,当文件名包含空格、特殊字符时会解析失败;如果file变量没有提前定义,会直接变成读取不存在的.txt文件,自然读不到内容。- 读取sample3内容的写法
value=cat sample3`` 存在兼容性问题,建议替换为更安全的value=$(<sample3),同时要提前确认sample3文件存在且有可读权限。
3. awk逻辑存在脆弱性
原代码中sub(/^..../, value)是硬匹配每行开头4个字符再替换为目标内容,逻辑非常不稳定:如果两个标题之间的行开头不是恰好4个字符,替换结果会完全不符合预期。如果需求是完全替换两个标题之间的所有内容,不需要保留原有中间行,直接在检测到! Heading 1后打印目标内容即可。
修复后可用的参考代码
# 读取目标插入内容,完整保留换行、特殊字符 value=$(<sample3) echo "$value" # 删除两个标题之间的内容,仅保留两个标题行 sed '/! Heading 1/,/! Heading 2/{//p;d;}' "$file.txt" > file-trimmed.txt # 向两个标题之间插入目标内容 awk -v value="$value" ' $0 == "! Heading 1" { replace = 1 print print value next } $0 == "! Heading 2" { replace = 0 print next } !replace { print } ' file-trimmed.txt > file-mod.txt
内容的提问来源于stack exchange,提问作者Janet D
相关产品推荐
相关产品推荐

