为什么我在sed&#a; / [a-z] * /(&)/ g'

时间:2016-08-26 14:19:27

标签: regex sed

我想为所有单词添加括号 我用了

sed 's/[a-z]*/(&)/g' 

inputfile.txt

hola crayola123456
abc123456

但是我选择所有空格

(hola) (crayola)1()2()3()4()5()6()
(abc)1()2()3()4()5()6()

我不应该只收到这些字吗? 我正在使用mac sed

感谢

3 个答案:

答案 0 :(得分:3)

原因是您正在使用可以匹配空字符串的正则表达式。 .img{float:left;} 可以匹配char之前的任何空格,因为正则表达式"看到" (即检查)这些职位。您需要将[a-z]*(匹配或更多次出现)替换为*量词(以匹配一个或更多字符)。

以下是如何在GNU sed中实现它的示例:

+

请参阅online demo

在Mac上,根据anubhava's comment,您需要使用echo "hola crayola123456" | sed 's/[a-z]\+/(&)/g' 选项并使用未转义的E

+

答案 1 :(得分:1)

两个错误

  1. *表示0个或更多匹配,您需要至少一个匹配,然后+;
  2. sed(OSX版本)默认使用基本的regexp(因此+不可用),您应该使用选项-E激活扩展的regexp语法
  3. 然后:

    echo "hola abc1234 foo12 bar" | sed -E 's/[a-z]+/(&)/g'
    

    产生

    (hola) (abc)1234 (foo)12 (bar)
    

答案 2 :(得分:1)

实际上sed在处理比赛时非常不一致。从纯正则表达式理论我可以看出,行中的任何序列[a-z]*都应该发出(&),因此理论上的完美结果将是(hola)() (crayola)()1()2()3()4()5()6,imho:First match [az] * hola,然后匹配[az] *作为下一个字符的空字符串,因为不匹配,它将被回显......依此类推......

Plan9 sed例如发出(hola)() (crayola)()1()2()3()4()5()6

Linux和BSD / Mac在这里做的很奇怪。如果您将"hola1""hola1a" (hola)1()(hola)1(a)进行比较,则可以看到效果。