在 sed 中是否有替代负面展望的方法

Is there an alternative to negative look ahead in sed

sed 我希望能够匹配 /js/ 但不能匹配 /js/m 我不能匹配 /js/[^m] 因为那会匹配 /js/ 加上任何东西字符出现在后面。负面展望在 sed 中不起作用。或者我会完成 /js/(?!m) 并收工。有没有一种方法可以使用 sed 来实现这一点,这种方法适用于大多数类似的情况,在这些情况下,您想要一段不以另一段文本结尾的文本?

有没有比 sed 更好的工具来完成我想做的事情?可能是一个允许向前看的。 awk自己的语言好像有点过分了

好吧,你可以这样做:

$ echo 'I would like to be able to match /js/ but not /js/m' |
    sed 's:@:@A:g; s:/js/m:@B:g; s:/js/:<&>:g; s:@B:/js/m:g; s:@A:@:g'
I would like to be able to match </js/> but not /js/m

当你找到 /js/ 时,你没有说你想用它做什么,所以我只是把它放在 <> 周围。这将适用于所有 UNIX 系统,与 perl 解决方案不同,因为不能保证 perl 可用并且不能保证允许您安装它。

我上面使用的方法是 sed、awk 等中的一个常见习惯用法,用于创建不能出现在输入中的字符串。只要它不出现在您真正感兴趣的字符串或正则表达式中,您对 @ 使用什么字符并不重要,在上面是 /js/s/@/@A/g 确保输入中每次出现 @ 后跟 A。所以现在当我做 s/foobar/@B/g 时,我已经用 @B 替换了每次出现的 foobar 并且我知道每个 @B 代表 foobar 因为所有其他 @ 后跟 A。所以现在我可以做 s/foo/whatever/ 而不会被出现在 foobar 中的 foo 绊倒。然后我用 s/@B/foobar/g; s/@A/@/g.

展开初始替换

在这种情况下,由于您没有使用多行保留空间,因此您可以更简单地使用:

sed 's:/js/m:\n:g; s:/js/:<&>:g; s:\n:/js/m:g'

因为换行符分隔的字符串中不能有换行符。以上仅适用于支持使用 \n 表示换行符的 seds(例如 GNU sed),但为了对所有 seds 的可移植性,它应该是:

sed 's:/js/m:\
:g; s:/js/:<&>:g; s:\
:/js/m:g'