在linux中插入一行带有sed命令的文件



我正试图在一个文件中插入一行,该文件将使用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

最新更新