Bash/Shell将文本块从x行替换为y行—这两行都包含在另一个文件的内容中

Bash/Shell将文本块从x行替换为y行—这两行都包含在另一个文件的内容中,bash,shell,awk,sed,Bash,Shell,Awk,Sed,假设我在文件A中有这个内容 1 <div class="a"></div> 2 <div class="b"></div> 3 <div class="c"></div> 4 <div.... 5 ... 6 ... 7 ... 8 ... 9 <div class="i"></div> 编辑:我的坏消息我没有通知被替换的实际文本是HTML如果我正确理解你的意思,$export\u file包

假设我在文件A中有这个内容

1 <div class="a"></div>
2 <div class="b"></div>
3 <div class="c"></div>
4 <div....
5 ...
6 ...
7 ...
8 ...
9 <div class="i"></div>

编辑:我的坏消息我没有通知被替换的实际文本是HTML

如果我正确理解你的意思,
$export\u file
包含文件名,
$stump\u text
替换从
$start\u line
$end\u line
的内容的文本应该是:

sed -i '${start_line},${end_line}s/.*/${stump_text}/' "$export_file"
试一试

由两个表达式组成:

  • -e“${start\u line}r${fileB}”
    读取
    ${fileB}
    指定的文件内容,并将其添加到
    ${start\u line}
    指定的行地址之后
  • -e“${start\u line},${end\u line}d
    删除这些地址范围中的行
    • 在awk中:

      $ cat foo.awk
      NR==start {                     # at start, output fileB.txt
          while (getline < file) 
              print }
      NR>=start && NR <= end { next } # between start and end do nothing
      1                               # print
      

      让它发挥作用,但并不漂亮——而且可能会变得更漂亮

      我无法作为字符串导入,因为我遇到了转义问题。 我无法保留从fileB到fileA的插入,因此需要一个tmp文件来保存

      这是解决办法

      sed -i "${start_line},${end_line}d" "$fileA"
      sed -e "${start_line}r ${fileB}" "$fileA" > "$fileA.out"
      mv "$fileA.out" "$fileA"
      

      如果有人能把它弄得更漂亮,请做-我需要学习:-)

      如果你也添加你用sed和awk尝试过的命令会更好..这会显示你的努力并可能得到答案谢谢你有道理-我现在有:-)谢谢你的帮助-我尝试过,但得到了sed:-e表达式#1,char 9:未终止的's'命令请注意t如果您在Windows上,使用默认命令提示符,则必须双转义反斜杠
      `->
      \\\`,否则将出现此错误。在Linux上,您必须转义一次:`\`。这可能与您的问题有关,也可能与您的问题无关。请忽略上一条注释中的代码格式,似乎有一个。\->\\\\和\\是我打算写的。看起来这可能是一种方法-但是被foo.awk抛出-您正在创建的文件是否包含一种awk函数,然后在您的awk函数调用中调用它?
      foo.awk
      是awk程序文件。您可以像
      awk-v…'NR==start{…}那样运行程序1'fileA.txt
      但这样布置时更容易用注释进行解释。只需将程序剪切并粘贴到文件
      foo.awk
      中,然后按上面所示的方式运行它。您的问题标题清楚地说明您要删除行的范围,并从另一个文件中添加内容。由于esca,
      在哪里无法作为字符串导入pe问题
      出现在图片中?我并没有发布我所有的努力来让它工作,其中一个尝试是使用cat创建一个变量来保存它-很抱歉没有做到这一点。
      r
      命令通过直接接受文件名来解决这个问题,这样就不会被新行、regex元字符绊倒等等。。。
      $ cat foo.awk
      NR==start {                     # at start, output fileB.txt
          while (getline < file) 
              print }
      NR>=start && NR <= end { next } # between start and end do nothing
      1                               # print
      
      $ fileb=fileb.txt;  start=4;  end=7    # your values into variables
      $ awk -v file=$fileb  -v start=$start  -v end=$end  -f foo.awk  fileA.txt
      
      sed -i "${start_line},${end_line}d" "$fileA"
      sed -e "${start_line}r ${fileB}" "$fileA" > "$fileA.out"
      mv "$fileA.out" "$fileA"