我正试图在一个文件中插入一行,该文件将使用sed命令在另一个文件插入一行如以下所示:要将此行sed -i '1s/^/insideFilen/' secondFile.sh
添加到firstfile.txt
的第65行
我试过了:
sed -i '65s/^/'sed -i '1s/^/insideFilen/' secondFile.sh'n/' firstfile.sh
但无法逃离'
也尝试过
sed -i "65s/^/'sed -i "1s/^/topLinen/" $FILE_HOME_LOCAL_FILE'n/" secondFile.sh
但是得到了sed:-e表达式#1,字符18:的未知选项
您可以使用此sed
:
sed -i.bak "65s~^~sed -i '1s/^/insideFile\\n/' secondFile.sh\n~" firstfile.sh
注:
- 使用备用分隔符
~
以避免转义/
- 在
sed
命令中使用双引号以避免转义单引号 - 使用
\\
插入单个 - 在双引号内使用
\n
插入换行符
用i
(插入(代替s
(替换(:
sed -i.bak "65i\
sed -i '1s/^/insideFile\\n/' secondFile.sh\
" firstfile.sh
最干净的解决方案是创建这样的sed脚本,从而避免所有引用和额外的转义:
cat ins.sed
65i
sed -i '1s/^/insideFile\n/' secondFile.sh
然后将其用作:
sed -i.bak -f ins.sed firstfile.sh
虽然sed
允许您做这些事情,但当涉及斜杠和其他控制字符时,它会变得有点麻烦。因此,使用awk
代替可能是有益的
$ awk '(FNR==65){print "sed -i 421s/^/insideFile\n/ 42 secondFile.sh"}1' firstfile.txt > firstfile.new
$ mv firstfile.new > firstfile.txt
有就地的可能性,但如果你仔细想想的话。就地只不过是制作一个临时文件,然后重新命名。这正是sed
正在做的事情。
我想将此行
sed -i '1s/^/insideFilen/' secondFile.sh
添加到firstfile.txt
的第65行
脚本化解决方案:
#!/bin/bash
## uncomment to make sure firstfile.txt has at least 65 (e.g. 66) lines
# for index in {1..66}; do
# echo -e "$index" >> firstfile.txt
# done
# prepare the insert text, escaping the newline character twice
text="sed -i '1s/^/insideFile\\n/'"
# append to 65th line
sed -i '' "65i\
$text
" firstfile.txt