使用sed匹配指定字符串后追加换行与文本的命令写法问题
问题原因
你的写法存在两个核心错误:
- 误用
&符号:sed的s替换语法中,&代表匹配到的完整原字符串,你在每一行追加内容前都加&,会导致每输出一行新内容前都重复打印一遍openssl_verify_mode: 'none',完全不符合预期。 - 换行写法不兼容:直接在命令中写入硬换行、或者不做转义直接写
\n的写法兼容性极差:一方面shell可能把未转义的换行识别为命令结束标记触发语法错误,另一方面BSD系sed(macOS、FreeBSD默认自带)默认不识别替换段中的\n为换行符,会直接输出字面的\n字符。
正确命令
GNU Sed 环境(绝大多数Linux发行版默认,如Ubuntu、CentOS、Debian等)
直接在替换段用\n表示换行,&仅在最开头写一次代表保留原匹配内容即可:
# 先去掉-i参数预览输出结果,确认无误再加-i写入文件 sed "s/openssl_verify_mode: 'none'/&\n domain: 'test.net'\n user_name: 'admin'\n password: 'mypassword'/g" /var/www/test-pro/config/configuration.yml # 确认结果正确后执行写入,加.bak后缀自动生成备份文件,避免误操作无法回滚 sed -i.bak "s/openssl_verify_mode: 'none'/&\n domain: 'test.net'\n user_name: 'admin'\n password: 'mypassword'/g" /var/www/test-pro/config/configuration.yml
执行后原匹配行会完整保留,下方按缩进要求追加三行配置内容。
BSD Sed 环境(macOS、FreeBSD等系统默认)
BSD sed要求-i参数必须显式指定备份后缀(空后缀也要写''),同时换行需要通过反斜杠转义,推荐用ANSI-C引用写法兼容转义逻辑:
sed -i.bak $'s/openssl_verify_mode: \'none\'/&\\\n domain: \'test.net\'\\\n user_name: \'admin\'\\\n password: \'mypassword\'/g' /var/www/test-pro/config/configuration.yml
执行后同样会自动生成.bak后缀的原文件备份,确认修改无误后可手动删除备份文件。
针对GB级别的大型文本文件,sed是流式逐行处理,不会把整个文件加载进内存,单条命令处理的效率远高于普通桌面文本编辑器,不会出现卡顿或内存不足问题。
内容的提问来源于stack exchange,提问作者Linus Siebert
相关产品推荐
相关产品推荐

