Bash 为什么sed会将替换文本放在行首?

Bash 为什么sed会将替换文本放在行首?,bash,sed,Bash,Sed,在Mac OS X(bash)上,我在命令行中使用以下sed: $ sed 's/\(\S*\)/\1 ~ /' file1.txt > file2.txt file1.txt有如下行: some/path_to/somewhere/- some{"stuff here"}-and_etc some/path_to/somewhere.else- some.more{"stuff here"}-and_etc 因此,我希望在第一组非空格字符之后的空格开始处出现~。相反,

在Mac OS X(bash)上,我在命令行中使用以下sed:

$ sed 's/\(\S*\)/\1 ~ /' file1.txt > file2.txt
file1.txt
有如下行:

some/path_to/somewhere/-     some{"stuff here"}-and_etc
some/path_to/somewhere.else-     some.more{"stuff here"}-and_etc
因此,我希望在第一组非空格字符之后的空格开始处出现~。相反,我在
file2.txt中得到了这个:

 ~ some/path_to/somewhere/-     some{"stuff here"}-and_etc
 ~ some/path_to/somewhere.else-     some.more{"stuff here"}-and_etc
我尝试在
\(\S
之前添加
^
,但这没有什么区别

如何使
file2.txt
看起来像这样:

some/path_to/somewhere/-~     some{"stuff here"}-and_etc
some/path_to/somewhere.else-~     some.more{"stuff here"}-and_etc

非常确定您的sed不理解
\S
是“非空白”的意思。它很可能试图匹配“零个或多个
S
字符”,并在字符串开头找到匹配项

您想坚持使用POSIX字符类:

sed 's/[^[:blank:]]\+/& ~ /' file1.txt

默认情况下,BSD(Mac OS X)
sed
不理解
\S
。事实上,即使使用
-E
选项启用扩展正则表达式,它也不会将
\S
理解为非空格。在Mac上,要使用
+
,您需要使用
-E
选项…或从
macports
安装GNU sed:)最后,
sed-E的/([^[:blank:]+)/&~/'
起了作用,所以这个答案和乔纳森·莱夫勒的评论就起到了作用。