Bash/Shell将文本块从x行替换为y行—这两行都包含在另一个文件的内容中
假设我在文件A中有这个内容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包
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"