我的目标是在程序代码中的每个数学运算符之前和之后添加空格。因此,我使用以下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
我可以看到预期行为和区分大小写之间没有可能的关系,会对这个问题的任何见解表示感谢。
答案 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
正如您所看到的那样,通过首先替换->
的出现并在之后将它们转换回来来解决丢失或未知到我的功能。
嗯,通常情况下,使用awk
或perl
可能会更好地解决这个问题。
干杯!