Bash 为什么sed会将替换文本放在行首?
在Mac OS X(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 因此,我希望在第一组非空格字符之后的空格开始处出现~。相反,
$ 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:]+)/&~/'
起了作用,所以这个答案和乔纳森·莱夫勒的评论就起到了作用。