如何像这样 sed 但在 bbe 中匹配/替换:
echo "abc894576def559872364abc23948572348576def" |sed -r "s@(abc[0-9]).*(def)@\1CCC\2@"
因为这没有任何作用:
echo "abc894576def559872364abc23948572348576def" |bbe -e "s@(abc[0-9]).*(def)@\1CCC\2@"
我需要,bbe
因为我需要忽略换行符,这也意味着我需要“def”作为第一个匹配项,而不是二进制文件中找到的最后一个匹配项,就像分隔符一样,所以我的正则表达式还不好......
答案1
-r
您将该选项与您的 一起使用sed
,因此您正在使用 GNU sed
(是用于扩展正则表达式-r
的该选项的仅 GNU 版本)。因此,如果您想要实现的只是同时覆盖换行符,请使用GNU 的选项来使用零字节而不是换行符作为分隔符:-E
E
.*
-z
sed
sed -zE "s@(abc[0-9]).*(def)@\1CCC\2@"
对于其他sed
版本,您需要获取模式空间中的所有行,如下所示:
sed -E "H;1h;$!d;x;s@(abc[0-9]).*(def)@\1CCC\2@"
这是收集保留空间中的所有行直到最后一行,然后交换缓冲区以立即处理整个文件。但请注意大文件的缓冲区大小限制。
下一个问题是你想要第一个def
匹配,所以你需要 Perl 的非贪婪 match .*?
,但是你没有sed
,所以你需要使用一个你知道它不属于其中的字符来解决这个问题文件的,让我们#
以这个例子为例:
sed -zE "s@def@#@g;s@(abc[0-9]).[^#]*#@\1CCC#@;s@#@def@g"
通过用单个字符替换模式,您可以使用反向匹配[^#]
来匹配除您要查找的字符之外的所有字符。如果您确定def
存在,您甚至可以删除#
模式末尾的 并进行替换。