String 在unix中,在模式第n次出现后删除n行,并在第n次出现后粘贴文件内容

String 在unix中,在模式第n次出现后删除n行,并在第n次出现后粘贴文件内容,string,file,unix,sed,paste,String,File,Unix,Sed,Paste,我有一个包含两个重复字符串的文件,这是我要识别的标记。标记是“(共)方差”,每个主题都有3条不同的线。我想删除第一个字符串后的3行,并用另一个文件的内容替换它。文件的结构如下所示: cat file1.txt 我想删除(CO)VARIANCES之后的三行,并用另一个包含内容的文件替换它。命令 sed -e '/(CO)VARIANCES/{n;N;N;d}' file1.txt 正在删除两个标记后面的3行,我不知道如何指示此命令中出现的次数。我不知道如何有条件地将第二个文件的第二个内容粘贴到

我有一个包含两个重复字符串的文件,这是我要识别的标记。标记是“(共)方差”,每个主题都有3条不同的线。我想删除第一个字符串后的3行,并用另一个文件的内容替换它。文件的结构如下所示:

cat file1.txt
我想删除
(CO)VARIANCES
之后的三行,并用另一个包含内容的文件替换它。命令

sed -e '/(CO)VARIANCES/{n;N;N;d}' file1.txt

正在删除两个标记后面的3行,我不知道如何指示此命令中出现的次数。我不知道如何有条件地将第二个文件的第二个内容粘贴到这些标记之后。有人对此有想法吗?< /P> < P>执行第n次发生的替换时,考虑下面的脚本(n是第n次出现)

awk-vn=3'
#如果需要,请删除
DEL>0{DEL--;next};
#查找匹配行
$1==“(共同)差异”&(-N)==0{
打印
DEL=3;
#在这里包括第二个文件。
而(getline v<“file2.txt”)打印v;
下一个
}
#打印所有其他行
{print}
'
这可能适合您(GNU-sed):

该解决方案由两个通过管道连接在一起的sed调用组成

第一个sed调用准备一个文件,该文件由file2中标记后面的行组成(在本例中为3)


第二次sed调用从第一次调用读取所需的行数,并从标记后面的file1中删除相同数量的行。

请显示其他文件的内容和预期输出。我是否理解正确,您只想替换第一次出现的
(CO)方差之后的3行,而第二次(可能以后)出现的
(CO)方差之后的数据保持不变?@Bodo,是的,您完全理解。我想对第二个标记也这样做。另一个文件的内容与我要删除的3行内容相同。事实上,我想用新值替换这3行。
sed -e '/(CO)VARIANCES/{n;N;N;d}' file1.txt
awk -v N=3 '

  # Delete if needed
DEL > 0 { DEL-- ; next } ;

  # Find matching line
$1 == "(CO)VARIANCES" && (--N) == 0 {
  print
  DEL = 3 ;

  # Include second file here.
  while ( getline v < "file2.txt" ) print v ;
  next
}
   # Print all other lines
{ print }
'
sed -En '/\(CO\)VARIANCES/{n;:a;s/[^\n]*/&/3;tb;N;ba;:b;p}' file2 |
sed -Ee '/\(CO\)VARIANCES/{n;:a;R /dev/stdin' -e 's/[^\n]*/&/3;tb;N;ba;:b;d}' file1