sed中使用变量展开插入含4个制表符的字符串失败问题
问题解决:指定行插入带制表符的字符串(存在则跳过)
需求
- 在文件指定行插入带4个制表符的目标字符串
- 若目标字符串已存在于文件中,跳过插入操作
初始测试文件(test.txt)
1 2 3 4 5
直接指定行号的插入操作
执行以下sed命令,在第3行前插入目标字符串:
sed -i '3i\ \t\t\t\t<file branch-rate="0.0">' test.txt
执行后文件内容:
1 2 <file branch-rate="0.0"> 3 4 5
使用变量指定行号的报错问题
当尝试用变量ln指定行号时:
ln=5 sed -i '${ln}i\ \t\t\t\t<file branch-rate="0.0">' test.txt
会出现错误:
sed: -e expression #1, char 4: extra characters after command
原因是单引号会阻止Shell解析变量,sed无法识别${ln}这个变量。
解决方法
1. 修复变量解析问题
改用双引号包裹sed表达式,让Shell先解析变量:
sed -i "${ln}i\ \t\t\t\t<file branch-rate="0.0">" test.txt
或者用单引号拼接的方式:
sed -i ''"$ln"'i\ \t\t\t\t<file branch-rate="0.0">' test.txt
2. 实现“存在则跳过”的逻辑
先检查文件中是否已存在目标字符串,不存在才执行插入:
# 定义目标字符串(用$'\t'表示制表符,确保跨平台兼容) target_str=$'\t\t\t\t<file branch-rate="0.0">' # 检查字符串是否存在,不存在则执行插入 if ! grep -qF "$target_str" test.txt; then sed -i "${ln}i\$target_str" test.txt fi
grep -qF:-q为静默模式(不输出结果),-F按字面匹配字符串,避免正则表达式干扰- 注意:部分系统(如macOS)的sed需要在
-i后加空参数(sed -i "" ...),否则会自动生成备份文件。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

