如何合并两条sed命令实现行编号并支持使用-i参数直接修改文件
合并sed命令实现直接修改源文件添加行号
问题描述
你需要给文件内容添加行号,同时使用sed的-i参数直接修改源文件,原管道命令如下:
sed '=' file.txt | sed 'N;s/\n/ => /'
最优解决方案
直接将两条sed的执行逻辑合并到同一次sed调用中即可,命令如下:
# GNU sed 环境(大部分Linux发行版默认) sed -i '=;N;s/\n/ => /' file.txt # macOS 自带BSD sed 环境 sed -i '' '=;N;s/\n/ => /' file.txt
命令说明
原管道命令的本质逻辑是:第一步给每一行输出对应行号+换行,第二步把行号行和对应的内容行合并,替换中间的换行符为=>。将两步逻辑放到同一条sed的执行序列里,就可以直接使用-i参数修改源文件,无需管道连接两次sed进程。
备选实现(基于暂存缓冲区)
你也可以用sed的暂存缓冲区实现相同效果,逻辑更清晰,兼容性更强:
sed -i -n 'h;=;G;s/\n/ => /p' file.txt
逻辑拆解:
-n关闭sed默认自动打印,避免输出冗余内容h将当前读取到的原文件行存入暂存缓冲区=生成并输出当前行号,默认自带换行G将暂存缓冲区的原行内容追加到模式空间,此时模式空间内容为「行号\n原行内容」s/\n/ => /替换行号和原内容之间的换行符为指定分隔符p打印替换后的最终内容
内容的提问来源于stack exchange,提问作者Pinguino
相关产品推荐
相关产品推荐

