使用含换行符的变量通过sed替换字符串时遇错误求助
解决含换行符变量的字符串替换问题
问题原因
sed的s命令会把换行符当成命令的结束标记,你变量里的换行直接截断了sed命令,导致出现「unterminated s command」错误。
可行解决思路
方法1:使用awk处理
awk对带换行的变量兼容性更好,直接传递变量即可完成替换:
str="" str+="#My header 1"$'\n' str+="#My header 2"$'\n' str+="#My header 3"$'\n' awk -v new_header="$str" '{gsub(/##HEADER##/, new_header)}1' myfile.out
-v new_header="$str":将shell变量str传递给awk的new_header变量gsub(/##HEADER##/, new_header):全局替换每行中的目标字符串- 末尾的
1:触发awk打印处理后的每一行
方法2:转义变量后用sed替换
先把变量里的换行转成sed能识别的转义字符,同时更换sed命令的分隔符避免冲突:
str="" str+="#My header 1"$'\n' str+="#My header 2"$'\n' str+="#My header 3"$'\n' # 转义特殊字符并将真实换行替换为sed转义换行 escaped_str=$(printf '%s' "$str" | sed 's/[\/&]/\\&/g; s/\n/\\n/g') sed "s|##HEADER##|$escaped_str|g" myfile.out
s/[\/&]/\\&/g:转义seds命令中的特殊字符/和&s/\n/\\n/g:把变量里的真实换行替换为sed可识别的\n- 用
|作为s命令的分隔符,避免和内容中的字符冲突
方法3:使用perl替换
perl对特殊字符和换行的处理更灵活:
str="" str+="#My header 1"$'\n' str+="#My header 2"$'\n' str+="#My header 3"$'\n' perl -pe "s/##HEADER##/\Q$str\E/g" myfile.out
-pe:逐行读取文件、处理后打印\Q和\E:自动转义变量str中的特殊字符,避免解析错误
内容的提问来源于stack exchange,提问作者Manolete
相关产品推荐
相关产品推荐

