删除直到第一个匹配项,编辑该行并按原样打印其余行

删除直到第一个匹配项,编辑该行并按原样打印其余行

我有以下文字:

add gmt version date
comment - text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue

我想要从第一次出现“注释”到文件末尾的所有文本。我正在使用sed 's/^.*Comment - //g'我只得到以下文本:

 text 3
 text3 continue

即从最后一次出现“comment”到文件末尾。但我需要从第一次出现“comment”到文本结尾的所有文本,即

    text1
    text1 continue
    comment - text2
    text2 continue
    comment - text 3
    text3 continue

答案1

最简单的方法sed是通过命令分组:

{ sed '/PATTERN/!d;s///;q'; cat; } <infile

d删除所有不匹配的行,在第一次匹配时,它s会根据您的请求进行替换并退出(自动打印),然后cat接管并打印剩余的行(如果有)。
并不是说你不能sed单独做到这一点:

sed '/PATTERN/,$!d         # delete all lines not in this range
//{                        # if the line matches
x;//!{                     # exchange and IF what was in hold space doesn't match
g;s///;b                   # get hold space content, replace, go to end of script
}
x                          # ELSE exchange back (do nothing)
}' <infile

我使用PATTERN它是为了保持简单(用^.*comment -或任何模式替换它)。

答案2

用管道完成的,但不太好

$ sed -n '/comment/,$ p' file | sed -r '0,/comment/ s/comment - (.*)/\1/'
text1
text1 continue
comment - text2
text2 continue
comment - text 3
text3 continue
解释
  • sed -n '/comment/,$ p' file打印从comment到末尾的行
  • sed -r '0,/comment/ s/comment - (.*)/\1/'找到第一行comment并编辑它以删除comment -

相关内容