在Linux上(BusyBox,QNAP-NAS)我想使用sed通过脚本为我的.bashrc
文件添加一些额外的路径。该文件的相关部分如下所示:
[...]
export PATH=\
/bin:\
/sbin:\
/usr/bin:\
/usr/sbin:\
/usr/local/bin
[...]
要插入的额外行(原始文件中的位置4)为/opt/bin:/opt/sbin:\
。要做到这一点,我的sed单行看起来像这样:
sed '4i/opt/bin:/opt/sbin:\\' .bashrc > .bashrc.tmp
,正确转义尾随反斜杠。以某种方式,sed将剩余的\'
转换为换行符反斜杠的换行符,结果是:
[...]
export PATH=\
/opt/bin:/opt/sbin:
/bin:\
[...]
添加第三个反斜杠可以得到尾部反斜杠,但仍会添加换行符,所以
sed '4i/opt/bin:/opt/sbin:\\\' .bashrc > .bashrc.tmp
结果
export PATH=\
/opt/bin:/opt/sbin:\
/bin:\
如果我在sed命令中添加额外的空格
sed '4i/opt/bin:/opt/sbin:\\ ' .bashrc > .bashrc.tmp
一切看起来都很好,但我也在行尾获得了额外的空间。
export PATH=\
/opt/bin:/opt/sbin:\ # extra space here
/bin:\
现在的诀窍是第二个sed命令删除尾随空格
#!/bin/sh
sed -e '4i/opt/bin:/opt/sbin:\\ ' .bashrc > .bashrc.tmp
sed -e 's/[ \t]*$//' .bashrc.tmp > .bashrc.tmp2 # change \t to real tab
但我仍然想知道为什么sed正在将\'
转换为换行符,以及如何使用简单的单行解决上述工作?如何使用sed插入(或追加)带有反斜杠的行?
提前谢谢。
答案 0 :(得分:1)
这是一种解决方法:
sed '4s|^|/opt/bin:/opt/sbin:\\\n|' .bashrc
答案 1 :(得分:1)
如果有任何帮助,我会使用四个反斜杠在一行的末尾附加一个没有空格的反斜杠。
我的命令如下:
sed "1i #backtrace_script\n#!/bin/sh\ngeany -si \\\\" \
导致
#!/bin/sh
geany -si \
答案 2 :(得分:0)
看起来像busybox sed中的错误。它适用于GNU sed 4.2.1。