为什么 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
在 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