是否可以修改此AWK命令以不仅打印匹配项,而且删除匹配项?

是否可以修改此AWK命令以不仅打印匹配项,而且删除匹配项?,awk,sed,match,Awk,Sed,Match,关于此命令是否有效: awk ' /Start/{f=1;rec=""} f{rec=rec $0 ORS} /End/{if (rec~/middle/) printf "%s",rec} ' original-file.txt > new-file-with-match.txt 如何将此脚本修改为: 将匹配项打印并输出到new-file-with-match.txt。现在可以使用了 删除original-file.txt中的匹配项 步骤1:original-f

关于此命令是否有效:

awk '
    /Start/{f=1;rec=""}
    f{rec=rec $0 ORS}
    /End/{if (rec~/middle/) printf "%s",rec}
' original-file.txt > new-file-with-match.txt
如何将此脚本修改为:

将匹配项打印并输出到new-file-with-match.txt。现在可以使用了 删除original-file.txt中的匹配项 步骤1:original-file.txt

步骤2:new-file-with-match.txt

步骤3:origing-file.txt最终阶段

使用SED是否可以更轻松地完成此操作?

您可以使用awk

鉴于:

$ cat f1.txt
blah1234
Start
blah..
blah..
middle
blah...
End
blah5324
你可以做:

$ awk  'NR==FNR && /^Start/,/^End/ {print} 
        NR==FNR                    {next} 
        !f1                        {f1=1; print "========="}
        /^Start/,/^End/ {next} 1' f1.txt f1.txt | awk 'BEGIN{fout="f2.txt"} 
        /^=========/ {fout="f1.txt"; next} {print >fout}'

$ cat f1.txt
blah1234
blah5324
$ cat f2.txt
Start
blah..
blah..
middle
blah...
End

只要将上面的调用更改为awk-f tst.awk file>tmp&&mv tmp file,或者在使用GNU awk时添加-i infle进行就地编辑。

在代码前面加四个空格。请看一看。您的问题包括简明的、可测试的样本输入和预期的输出,通过{}按钮正确格式化。sed是对单个行的简单替换,仅此而已。您试图做的并不是对单个行进行简单的替换,因此这不是sed的工作。使用awk听起来很简单,但在您提供缺少的信息之前,很难说。我看到了开始和结束,但没有中间,中间是必要的,因为它确保选择了正确的开始/结束块。我们无法将此与我的示例关联。我试过这个例子,但结果不是我所期望的。我很糟糕,你是对的,你的例子确实有效。我不应该在bash for循环中修改它,并尝试将newFile.txt更改为for循环中使用的变量。。很抱歉,谢谢您的示例,我想,我把它弄坏了一点,试图在for循环中工作。^1非常优雅 blah1234 blah5324
$ cat f1.txt
blah1234
Start
blah..
blah..
middle
blah...
End
blah5324
$ awk  'NR==FNR && /^Start/,/^End/ {print} 
        NR==FNR                    {next} 
        !f1                        {f1=1; print "========="}
        /^Start/,/^End/ {next} 1' f1.txt f1.txt | awk 'BEGIN{fout="f2.txt"} 
        /^=========/ {fout="f1.txt"; next} {print >fout}'

$ cat f1.txt
blah1234
blah5324
$ cat f2.txt
Start
blah..
blah..
middle
blah...
End
$ cat tst.awk
/Start/ { f=1; rec="" }
f {
    rec=rec $0 ORS
    if (/End/) {
        if (rec~/middle/) {
            printf "%s",rec > "newFile.txt"
        }
        else {
            printf "%s", rec
        }
        f = 0
    }
    next
}
{ print }

$ awk -f tst.awk file
blah1234
blah5324

$ cat newFile.txt
Start
blah..
blah..
middle
blah...
End