1

我的目标是在程序代码中的每个数学运算符之前和之后添加空格。因此,我使用以下 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

我看不出预期的行为和区分大小写之间没有可能的关系,感谢您对该问题的任何见解。

4

1 回答 1

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

正如您所看到的,丢失或可能对我来说未知的功能是通过首先替换出现的->然后再将它们转换回来来解决的。

好吧,通常用awkor解决这个问题可能会更好perl

干杯!

于 2012-05-31T20:43:24.660 回答