如何使用grep筛选出mykey后未跟随nice comment的内容?
实现方法
你的需求完全可以实现,之前的命令出错是因为grep -v只会单独过滤掉包含nice comment的行,但没法关联mykey和它对应的评论块,导致结果混乱。下面提供两种可靠的解决办法:
方法一:用awk处理(推荐)
awk可以按自定义分隔符分割文本块,正好适配你用...分隔每个mykey组的结构。执行以下命令:
awk 'BEGIN{RS="\\.\\.\\."} /mykey/ && !/nice comment/{print $0 "\n"}' 你的文件名
原理:
BEGIN{RS="\\.\\.\\."}:把...设置为记录分隔符,每个mykey及其对应评论、换行就被当作一个独立的“块”/mykey/ && !/nice comment/:只筛选包含mykey但不包含nice comment的块print $0 "\n":输出符合条件的块并添加换行分隔,和你期望的格式一致
方法二:用grep上下文选项
如果每个mykey和对应评论的行数固定(比如mykey后第1行就是评论),可以用grep的上下文参数关联行:
grep -A 1 'mykey' 你的文件名 | grep -v -A 1 -B 0 'nice comment'
原理:
grep -A 1 'mykey':提取每个mykey行以及它后面1行的内容grep -v -A 1 -B 0 'nice comment':过滤掉包含nice comment的行,以及它后面1行的内容(也就是整个mykey+nice comment的组)
两种方法都能得到你期望的输出:
mykey not bad comment mykey excellent comment
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

