使用awk或sed更改模式后的下一行

时间:2016-05-27 06:15:07

标签: bash awk sed

我有一个包含数千行的文件,其内容与此类似:

completedJob=job details abc
completedJob=job details def
currentJob=job details ghi
queuedJob=job details jkl
queuedJob=job details mno

我想将其更改为:

completedJob=job details abc
completedJob=job details def
completedJob=job details ghi
currentJob=job details jkl
queuedJob=job details mno

在其他作品中,将currentJob更改为completedJob,将queuedJob更改为currentJob

我已经看到了类似问题的答案,该问题提供了sedawk解决方案(https://stackoverflow.com/a/8336918/257233),但我无法弄清楚&符号是如何工作的第二个该答案中的一行,以及如何修改第二行的一部分。

4 个答案:

答案 0 :(得分:2)

你可以使用它,

$ cat test
completedJob=job details abc
completedJob=job details def
currentJob=job details ghi
queuedJob=job details jkl
queuedJob=job details mno

$ sed '/^currentJob/{s/^currentJob/completedJob/;n;s/^queuedJob/currentJob/}' test
completedJob=job details abc
completedJob=job details def
completedJob=job details ghi
currentJob=job details jkl
queuedJob=job details mno

<强>解释

  • /^currentJob/匹配以currentJob
  • 开头的行 在同一行上
  • s/^currentJob/completedJob/;,将currentJob替换为completedJob
  • n;转到下一行。
  • s/^queuedJob/currentJob/在下一行,将queuedJob替换为currentJob

答案 1 :(得分:1)

$ awk -F= 'f==1{$1="currentJob"; f=2} f==0 && /currentJob=/{$1="completedJob"; f=1} 1' OFS== test
completedJob=job details abc
completedJob=job details def
completedJob=job details ghi
currentJob=job details jkl
queuedJob=job details mno

如何运作

Awk隐式地逐行读取文件。每行分为字段。此代码使用一个变量f来跟踪我们在文件中相对于currentJob的位置。

  • -F=

    这告诉awk将=视为输入字段分隔符

  • f==1{$1="currentJob"; f=2}

    每当标记f1时,请将第一个字段设置为currentJob并将f更新为2

  • f==0 && /currentJob=/{$1="completedJob"; f=1}

    如果f为零(或尚未设置)且第一个字段为currentJob,请将第一个字段更新为completedJob

  • 1

    这是打印全行的awk简洁速记

  • OFS==

    这告诉awk使用=作为输出的字段分隔符。

答案 2 :(得分:1)

$ cat tst.awk
BEGIN { FS=OFS="=" }
$1=="currentJob" { c=1 }
c==2 { $1="currentJob"; c=0 }
c==1 { $1="completedJob"; c++ }
{ print }

$ awk -f tst.awk file
completedJob=job details abc
completedJob=job details def
completedJob=job details ghi
currentJob=job details jkl
queuedJob=job details mno

答案 3 :(得分:1)

让我们在行尾使用正则表达式来完成我们的工作。

awk '/ghi/{sub(/current/,"completed")}/jkl/{sub(/queued/,"current")}1' file
completedJob=job details abc
completedJob=job details def
completedJob=job details ghi
currentJob=job details jkl
queuedJob=job details mno