Sed:搜索任何非空格符号都区分大小写

时间:2012-05-31 19:38:28

标签: sed whitespace case-sensitive

我的目标是在程序代码中的每个数学运算符之前和之后添加空格。因此,我使用以下sed命令:

sed
-e 's/\([^ ->]\)\([\+=-\*]\)/\1 \2/g'
 -e 's/\([\+=-\*]\)\([^ ->]\)/\1 \2/g'"
input > output

第一行搜索非空格(或不是 - >运算符),后跟数学运算符,并将其替换为由空格分隔的两个字符。另一个对相反顺序的字符也一样。

然而,除了所需的行为,它还可以在所有大写字母之间添加空格。我还使用选项I(不区分大小写)对其进行了测试,然后文件中的所有单词都按空格分隔为单个字符,如下所示:

.....d r a i n c u r r e n t w i t h o u t v e l o c i t y s a t u r a t i o n e f f e c t

我可以看到预期行为和区分大小写之间没有可能的关系,会对这个问题的任何见解表示感谢。

1 个答案:

答案 0 :(得分:3)

我注意到的第一件事就是你在一个字符级范围内操作,你可能不想这样做:

[^ ->] 

上面的剪辑实际上意味着“匹配任何不在SPACE和GREATER_THAN之间的东西,除非你逃避减号。例如,在基于ASCII的系统上,这也将包括以下任何字符:!"#$%&'()*+,-./0123456789:;<=

另外,据我所知,POSIX正则表达式语法实际上并没有提供一种方法来说“匹配除序列之外的所有内容”xyz“(使用Perl可以使用类似((?!xyz)[a-z]+)的内容来匹配任何序列除了那些以“xyz”开头的字符外的小写字符。

然而,如果我被迫使用sed,我就会采用这种方式:

mjhennig@blackbox:~$ sed \
>   -e 's/->/T_PARAM_OBJECT_ACCESS/g' \
>   -e 's/\([^\s]\)\([+\-=*]\)/\1 \2/g' \
>   -e 's/\([+\-=*]\)\([^\s]\)/\1 \2/g' \
>   -e 's/T_PARAM_OBJECT_ACCESS/->/g' <<< "alpha->prop+bravo - test=check"
alpha->prop + bravo - test = check

正如您所看到的那样,通过首先替换->的出现并在之后将它们转换回来来解决丢失或未知到我的功能。

嗯,通常情况下,使用awkperl可能会更好地解决这个问题。

干杯!