用sed和perl中的多行文本替换多行文本

时间:2017-01-07 05:24:41

标签: regex perl awk sed

这是我的档案

      start
      exit 0

      status
      exit 0

      stop
      exit 0

结果文件应为

      start
      exit 0

      status
      exit 152

      stop
      exit 0

任何帮助表示赞赏 我怎么能用sed和perl来做呢

3 个答案:

答案 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/ && pawk在当前记录中找到单词退出且变量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