全部:
我们如何使用 sed 按两个标准过滤行?
aptitude -v show '?name(grep)' | egrep --color=always "^|grep" | sed 's/^\(Package: .*\)$/\x1b[33;1m\1\x1b[0m/'
在上面,我想做的是首先使用 grep 为我的搜索字符串(本例中为“grep”)的任何找到的匹配项着色,然后将 aptitude 输出中的所有“Package: ...”标题行着色为黄色。但是,如果任何“Package:...”行之前已通过egrep ...命令添加了红色,则该行会以黄色开头,针对找到的“grep”字符串转换为红色,然后恢复为红色当找到 '\e[0m' 时变为正常颜色(正如我所期望的那样)。
因此,在我看来,我要做的就是找到任何“Package:...”行,然后仅在这些行中去掉可能的颜色代码,然后将整行着色为黄色。
sed "s,\x1B\[[0-9;]*[a-zA-Z],,g"
...将删除代码,但我只需要在以“Package: ....”开头的行上运行它。咒语是什么?或者,可能有更优雅的方法来做到这一点吗?
答案1
man sed
会告诉你:
Sed commands can be given with ... one address, in which case the
command will only be executed for input lines which match that address;
...
/regexp/
Match lines matching the regular expression regexp.
所以你可以这样做:
sed '/Package/ s/replace/stuff/'