使用SED搜索模式并删除第二次出现的模式后的下一行

使用SED搜索模式并删除第二次出现的模式后的下一行,sed,Sed,我不熟悉Shell脚本,需要您的帮助,以找到一种方法“使用SED搜索模式并删除第二次出现的模式后的下一行”。我可以删除搜索模式后的行(表单第一次出现),但我的要求是删除第二次出现后的空行 sed -re "s/^([^^L])/ \1/" -e "s/^^L/1/" -e "/$esc_filename/{p;s/$esc_filename/"${new_filename}"/}" -e "/^"$new_filename"/{n;d}" "$i" >> "$source_dir/$

我不熟悉Shell脚本,需要您的帮助,以找到一种方法“使用SED搜索模式并删除第二次出现的模式后的下一行”。我可以删除搜索模式后的行(表单第一次出现),但我的要求是删除第二次出现后的空行

sed -re "s/^([^^L])/ \1/" -e "s/^^L/1/" -e "/$esc_filename/{p;s/$esc_filename/"${new_filename}"/}" -e "/^"$new_filename"/{n;d}" "$i" >> "$source_dir/${cap_new_rep_id}.TXT"

上面的命令确实搜索Control-L,如果找到,则用1替换为空空格,然后再次搜索字符串并替换为另一个字符串,最后将搜索最新的字符串并删除之后的下一行,但我只需要一个选项,以便在找到第二个模式后删除下一行

如果有人能为实现这一目标提供一些帮助,那将是非常棒的


感谢您的帮助。

考虑改用
awk

awk -v first=1 '
  !ignore { print }           # unless the line is ignored, print it
  ignore { ignore = 0 }       # if it was ignored, reset ignore flag
  /pattern/ {
    if(!first) { ignore = 1 } # set ignore bit it pattern is found and it is not the first time
    first = 0                 # since the pattern has been found, it is not the first time after this.
  }' foo.txt
转换此文件:

 0
 pattern
 1
 2
 3
 pattern
 4
 pattern
 6
 7
为此:

0
pattern
1
2
3
pattern
pattern
7
只要用你的模式替换模式,就应该是这样。而且,与sed相比,更容易看到正在发生的事情

编辑:我不应该尝试在带有单引号的shell脚本字符串中的注释中使用
。那太傻了

附录:由于OP在注释中被询问,除了第一次出现图案外,删除第n行的一种方法是使用忽略计数器而不是标志:

# adjust N as necessary
awk -v first=1 -v ignore=0 -v N=2 '
  ignore != 1 { print }          
  ignore != 0 { ignore -= 1 }
  /pattern/ {
    if(!first) { ignore = N }
    first = 0                
  }' foo.txt
…我相信这就是我留下链接的地方

示例一个包含以下内容的文件

hello world
I DON'T want to delete this line since the first pattern is above
world
I want to delete this line
my name is John
my name is Joe
world
I want to delete this line
My name is Jack
this is world
I want to delete this line
rule
在这种情况下,让我们考虑的模式是<代码>世界< /代码>

   sed '0,/world/!{/world/{N
    s/\n.*//g}}' my_file
输出

hello world
I DON'T want to delete this line since the first pattern is above
world
my name is John
my name is Joe
world
My name is Jack
this is world
rule

非常感谢你的快速转身。我请求SED命令的原因是我不想再次读取输出文件并应用AWK,而是使用SED命令一次性完成。相信你明白。你可以像对待sed一样通过awk。只要不指定文件名,它就会从stdin读取。感谢Winter,我已经完成了我发布此请求的任务。我修改了脚本,添加了带有管道的AWK,并将其写回输出文件。第二部分为第二部分,第二部分为据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据据第第7 7 7 7 7 7 7 7 7月第1/1/1/1/1/1,,,,,,,第1/1/1/1/1/1/1,据据据据据据据据据据据据据据据据据据据据据据据,除了下一行或第一行之外,是否有删除第二行或第三行的选项?当然。添加了一个示例和一个重要链接。为我们提供了要更改的文本输出以及您期望的输出。
   sed '0,/world/!{/world/{N
    s/\n.*//g}}' my_file
hello world
I DON'T want to delete this line since the first pattern is above
world
my name is John
my name is Joe
world
My name is Jack
this is world
rule