在 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'
在 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'