如何在sed中使用正则保留指定行并删除其后一行?
在sed中实现保留指定行并删除其下一行的需求
原始样本数据
ServerA Value1 fh824rfz Plan CustomA ServerB Value3 9fgjzxlo Plan CustomD ServerC Value10 339fgh0l Plan CustomE
需求说明
保留所有以Value开头的行,同时删除该行的下一行,预期输出如下:
ServerA Value1 fh824rfz ServerB Value3 9fgjzxlo ServerC Value10 339fgh0l
已尝试的操作
在VSCode里用正则(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)就能搞定,但在sed里试了下面几个命令都没用:
-E 's|(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)\n|\1|g' -re 's|(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)\n|\1|g' -zre 's|(Value[0-9]{1,2} [0-9a-z]{8}\n)(.*)\n|\1|g'
推测问题出在换行符\n的处理上,请问怎么用sed实现这个需求?
解决方案
sed默认是逐行处理的,不会主动跨行捕获换行符,所以直接在替换规则里写\n根本抓不到下一行内容。要处理跨行逻辑,得用sed的N命令把下一行拉到当前模式空间,再做匹配替换。
方法一:简洁版(匹配所有Value开头的行)
执行这个命令就行:
sed -E '/^Value/{N;s/(.*)\n.*/\1/}' 你的文件名.txt
拆解一下:
/^Value/:定位到所有以Value开头的行{N;...}:对匹配到的行执行N命令,把下一行追加到当前处理的内容里(此时模式空间里是Value行\n下一行)s/(.*)\n.*/\1/:把模式空间里的内容替换成第一个捕获组(也就是原来的Value行),相当于直接删掉下一行
方法二:精准匹配格式(对应你原正则的严格格式)
如果要严格匹配Value后跟1-2位数字、空格、8位字母数字的行,再删下一行,用这个:
sed -E '/^Value[0-9]{1,2} [0-9a-z]{8}$/{N;s/(.*)\n.*/\1/}' 你的文件名.txt
方法三:用-z选项处理整个文件
你之前试了-z但写法不对,-z会把整个文件当成一个以空字符分隔的数据流,此时\n可以正常匹配,调整后的命令:
sed -zE 's/(Value[0-9]{1,2} [0-9a-z]{8})\n.*\n/\1\n/g' 你的文件名.txt
注意这里要调整正则的捕获和替换逻辑,确保替换后保留正确的换行结构。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

