这是我的档案
start
exit 0
status
exit 0
stop
exit 0
结果文件应为
start
exit 0
status
exit 152
stop
exit 0
任何帮助表示赞赏 我怎么能用sed和perl来做呢
答案 0 :(得分:3)
使用Awk
<强>输入强>
$ cat f
start
exit 0
status
exit 0
stop
exit 0
<强>输出强>
$ awk '/exit/ && p {sub($NF,"152")}{p=/status/}1' f
start
exit 0
status
exit 152
stop
exit 0
<强>解释强>
p=/status/
只要p
找到字状态awk
为true
/exit/ && p
当awk
在当前记录中找到单词退出且变量p
评估为真时sub(regexp,replacement [,target])
搜索目标,它被视为一个字符串,用于由正则表达式regexp匹配的最左边,最长的子字符串。通过将匹配的文本替换为替换来修改整个字符串。修改后的字符串成为目标的新值。返回所做的替换次数(零或一次)。如果省略第3个参数,则默认使用并更改$0
。
sub($NF,"152")
用当前记录的$NF
替换最后一个字段(152
),因为未给出第三个参数,因此默认$0
被更改。
} 1
1
总是计算为true,它执行默认操作{print $0}
答案 1 :(得分:1)
perl -pe's/exit \K\d+/152/ if $f; $f = /status/'
用法:
perl -i~ -pe'...' file # Edit in place with backup
perl -i -pe'...' file # Edit in place without backup
perl -pe'...' file.in >file.out # Read from file
perl -pe'...' <file.in >file.out # Read from stdin
答案 2 :(得分:0)
使用sed可以使用:
$ sed '/status/{n;s/0/152/}' input
start
exit 0
status
exit 152
stop
exit 0