标题:sed之h;H和:a;N;ba使用精解(对段落进行操作) 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Fri, 18 Sep 2020 16:03:37 +0000 作者:jackxiang 地址:https://jackxiang.com/post/10679/ 内容: 这是老式编程语bai言里的标签跳转, 相当于C语言du里面的goto语句 可以实现 分支选择zhi, 循环等功能 sed '/^AA/ba;s/$/ NO/;b;:a;s/$/ YES/' 解读如下dao sed是逐行扫描的 /^AA/ba;s/$/ NO/ 意思是如果当前行句首是AA 则跳转到标签a,执行s/$/ YES/ 即在行末插入YES (这里使用替换s命令实现插入) 否则执行s/$/ NO/, 在行末插入NO 对所有行都执行这种操作, 大功告成 echo 1 2 3 4 5 6 7 8 9 10 | perl -p -e 's#(\d+) #\1\n#g' | sort -n -k 1 | sed -e :a -e '$d;N;2,3ba' -e 'P;D' 3ba表示去掉最后3行,你要保留最新的5个,那就是5ba好了 sed -n '/^Handle/{:a;N;/\n$/!{$!ba};s/.*Range Size: \([^\n]*\).*/\1/p}' file [解析] 文本就3个段落,2个空行为分割,用sed首先想到肯定是以空行为分割,把一整段文本读取在一起,然后统一进行匹配和替换,特别注意N读取内容匹配空行是 /\n$/ ,而不是一般的 /^$/ ,另一个问题是到了尾行因为没有下面的空行来激活,所以我们要在前面加个尾行的匹配跳转。这样就可以成功替换以Handle开头的段落内容,如果没匹配到也当然不会打印。 sed -n 'H;/^$/!{$!b};x;s/\nHandle.*Range Size: \([^\n]*\).*/\1/p' file [解析] 因为是以空行为分割,H 追加到 hold space ,后面的替换只对空行或者最后一行才执行,否则都会跳过,也只有符合关键字的才会被替换打印。其他的行则因为 -n 的原因不会被输出。 From:https://blog.csdn.net/woshizhangliang999/article/details/53379158 Generated by Jackxiang's Bo-blog 2.1.1 Release