【问题标题】:Using AWK to treat files使用 AWK 处理文件
【发布时间】:2010-04-01 13:26:58
【问题描述】:

我想用 awk、grep 或 sed 创建一个批处理文件,它保留所有以“INSERT”开头的行并删除其他行。

在此之后,当处理的行中的第三个单词是“donextsit”时,我想用“servicechange)”替换字符串“change)”。

有人能解释一下怎么做吗?

【问题讨论】:

  • 由于我们不知道您所在的时区,因此很容易假设您在夏威夷,直到 3:58 HST 才提供答案。 SO 主要不是家庭作业服务。虽然您通常会很快得到答案,但试图将 SO 推迟到您的截止日期是不合理的 - 特别是在不清楚截止日期实际是什么时候。
  • 感谢 edgar.holleis 和 ghostdog74。这似乎是个好主意,但我又遇到了一些问题。 :( 我想把结果放到一个文件里。怎么做?我想是“打印”命令可能会被别的东西代替。谁能帮帮我?
  • @Kev:我同意时间要求不合适,但现在不清楚第一条评论指的是什么。该怎么办?评论中的信息普遍适用。或许这里就不用说了。
  • @jonathon - 可能删除评论。从用户资料来看,并没有真正增加价值和判断,他早就走了。我会编辑帖子并在那里留下关于“帮助!我现在需要这个”的原因评论。

标签: sed awk grep


【解决方案1】:
awk '/INSERT/{ 
    if ($3=="donextsit"){
       gsub("change","servicechange");
       print
    }
}' file

因为这是家庭作业,有些东西仍然无法正常工作..你应该自己找出来

【讨论】:

  • 也可以避免 if 语句:awk '/^INSERT/ && $3 == "donextsit" { gsub(); print}' file
  • 我对他的 qns 有不同的理解。我的猜测是他也想打印没有“donextsit”的 INSERT 语句。注意:我的解决方案不是故意的。
【解决方案2】:
sed '
    /^INSERT/ ! d;
    /^ *[^ ]\+ *[^ ]\+ *donextsit / s/change)/servicechange)/g;
' -i file

编辑:采纳 Jonathan Leffler 的建议。

【讨论】:

  • 更简单:sed '/^INSERT/!d; ...' ... 可以节省标签和分支。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2012-08-09
相关资源
最近更新 更多