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

Why is sed putting substituted text at the start of a line?

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

$ sed 's/\(\S*\)/ ~ /' 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

所以我希望在第一组非 space 字符之后 spaces 开始的地方出现 ~。相反,我在 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 理解为 "non-whitespace"。它很可能会尝试匹配 "zero or more S characters",并在字符串的开头找到匹配项。

您想坚持 POSIX 字符 类:

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