sed命令无执行效果排查及指定短语后追加文件内容的方法
Shell脚本问题排查与解决方案
一、sed命令无作用的排查与修复
原脚本里的sed命令失效主要有几个原因,对应修复方法如下:
- 变量未展开:原命令
sed -i "${LINE_NUMBER}r FILE_TO_INSERT" ${FILE_TO_MODIFY}中,FILE_TO_INSERT是变量但没被解析,sed会把它当成字面文件名,自然找不到文件。要改成变量展开的形式:sed -i "${LINE_NUMBER}r $FILE_TO_INSERT" ${FILE_TO_MODIFY} - LINE_NUMBER为空:如果
grep -n "ATOMIC" "$FILE_TO_MODIFY"没找到匹配内容,LINE_NUMBER会是空值,sed执行的命令相当于空行,不会有任何操作。可以先加判断:if [ -n "$LINE_NUMBER" ]; then sed -i "${LINE_NUMBER}r $FILE_TO_INSERT" ${FILE_TO_MODIFY} else echo "未找到短语'ATOMIC'" fi - 跨平台sed的-i参数差异:在macOS(BSD sed)下,
-i需要指定备份后缀(空后缀表示不备份),命令要改成:
GNU sed(Linux)则不需要空后缀,原参数格式可用。sed -i "" "${LINE_NUMBER}r $FILE_TO_INSERT" ${FILE_TO_MODIFY} - 脚本语法错误:原脚本中
read output file是错误的,变量名不能含空格,应该改成read output_file,否则后续$output_file会无法正确引用。
二、将file1.txt内容追加到file2.txt指定短语后
有两种简单实现方式:
方法1:用sed的r命令
直接匹配目标短语,在匹配行后插入file1.txt的全部内容,如需直接修改file2.txt,根据系统选择命令:
- Linux(GNU sed):
sed -i '/目标短语/r file1.txt' file2.txt - macOS(BSD sed):
注:如果不想直接修改原文件,去掉sed -i '' '/目标短语/r file1.txt' file2.txt-i参数,将输出重定向到新文件即可,比如sed '/目标短语/r file1.txt' file2.txt > new_file.txt。
方法2:用awk实现
awk '/目标短语/{print; system("cat file1.txt")}1' file2.txt > temp_file && mv temp_file file2.txt
原理是匹配到目标短语时,先打印该行,再执行cat file1.txt插入内容,1表示打印所有行,最后通过临时文件替换原文件。
内容的提问来源于stack exchange,提问作者fariba
相关产品推荐
相关产品推荐

