我有一个包含数千行的文件,其内容与此类似:
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
。
我已经看到了类似问题的答案,该问题提供了sed
和awk
解决方案(https://stackoverflow.com/a/8336918/257233),但我无法弄清楚&符号是如何工作的第二个该答案中的一行,以及如何修改第二行的一部分。
答案 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}
每当标记f
为1
时,请将第一个字段设置为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