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

Sed:搜索任何非空格符号都区分大小写,sed,whitespace,case-sensitive,Sed,Whitespace,Case Sensitive,我的目标是在程序代码中的每个数学运算符之前和之后添加空格。因此,我使用以下sed命令: sed -e 's/\([^ ->]\)\([\+=-\*]\)/\1 \2/g' -e 's/\([\+=-\*]\)\([^ ->]\)/\1 \2/g'" input > output 第一行搜索非空格(或非->运算符),后跟数学运算符,并将其替换为以空格分隔的两个字符。另一种方法同样适用于顺序相反的字符 然而,除了所需的行为外,它还可以在所有大写字母之间添加空格。我还使用选项I(

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

我看不出预期行为和区分大小写之间可能存在的关系,如果您能深入了解这一问题,我将不胜感激。

我注意到的第一件事是,您正在操作的字符类范围可能不希望这样做:

[^ ->] 
上述截断实际上意味着“匹配任何不在空格和大于之间的字符,除非您转义减号。例如,在基于ASCII的系统上,这还包括以下任何字符:
!”#$%&'()*+,-./0123456789:;道具+布拉沃-测试=检查“
阿尔法->道具+布拉沃-测试=检查
正如您所看到的,通过首先替换出现的
->
并随后将其转换回来,可以解决缺少的或可能未知的功能

不过,通常使用
awk
perl
可以更好地解决这个问题


干杯!

关于
i++
之类的东西呢?一个样本输入和期望的输出不会有什么伤害。那些双引号应该在那里吗?当我不带它们运行时,我得到了“无效范围结束”,直到我将
\+=-\*
更改为
*\+=-
,因此我没有任何奇怪的行为。
[^->]
位说“匹配任何不在空格和'>'之间字符范围内的内容。您不能期望
->
将一个字符与您希望在字符类中使用的两个字符标记相匹配…谢谢您的回答。我不想使用->作为字符串,而是使用两个单独的字符。不管怎样,这都是一个意外的语法问题。
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