【问题标题】:Can this AWK command be modified to not only print the match, but also delete the match?是否可以修改此 AWK 命令以不仅打印匹配项,还删除匹配项?
【发布时间】:2017-02-01 03:00:03
【问题描述】:

关于这个有效的命令:

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

如何将此脚本修改为:

  1. 将匹配打印并输出到 new-file-with-match.txt(现在可以使用)
  2. 删除 original-file.txt (?) 中的匹配项

STEP1:原始文件.txt

废话1234 开始 废话。。 废话。。 中间 废话…… 结束 废话5324

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

开始 废话..废话 废话。。 中间 废话…… 结束

STEP3:original-file.txt(最后阶段)

废话1234 废话5324

使用 SED 可以更轻松地完成这项工作吗?

【问题讨论】:

  • edit 您的问题包括简洁、可测试的样本输入和预期输出,通过{} 按钮正确格式化。 sed 用于在单个行上进行简单替换,仅此而已。您要做的不是对单个行进行简单的替换,因此它不是 sed 的工作。听起来 awk 很简单,但在您提供缺失的信息之前很难说。

标签: awk sed match


【解决方案1】:
$ 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

如果您使用 GNU awk,只需将上面的调用更改为 awk -f tst.awk file > tmp && mv tmp file 或添加 -i infile 以进行就地编辑。

【讨论】:

  • 无法将其与我的示例相关联。尝试了这个例子,但结果不是我所期望的
  • 我的错,你是对的,你的例子确实有效。我不应该通过放入 bash for 循环来修改它,并尝试将“newFile.txt”更改为 for 循环中使用的变量。对此感到抱歉,谢谢你的例子,我猜,我把它弄坏了,试图在 for 循环中工作。
  • ^1 非常优雅
【解决方案2】:

你可以使用 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

【讨论】:

  • 我看到 Start 和 End 但没有看到 "middle" ,中间是必需的,因为它确保选择了正确的 Start/End 块
猜你喜欢
  • 1970-01-01
  • 2015-03-07
  • 2015-05-07
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2014-09-07
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多