我有以下文字:
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 -