sed (in bash) works with [ \t] but not with \s?

我们两清 提交于 2020-02-21 12:57:42

问题


I want to search-replace something containing whitespace on a bash command line, and I assumed sed would be the easiest way to go.

Using [ \t] denoting either tab or space, to match the whitespace, works as intended:

echo "abc xyz" | sed "s/[ \t]xyz/123/"
abc123

But using \s instead of [ \t] does not, to my surprise:

echo "abc xyz" | sed "s/\sxyz/123/"
abc xyz

I'm fairly new to bash so I might be missing something trivial, but no matter what I do, I can't get this to work. Using \\s instead of \s, using single quotes (' instead of "), putting the whitespace marker inside square brackets (like [\s] or even [\\s]), nothing seems to help..?

(edit) in case it differs from one sed / bash version to another: I'm working on OS X here.

Additionally, I noticed that when I add a + after the [ \t] whitespace part, to optionally grab multiple space/tab characters if present, it doesn't work anymore either...??

echo "abc xyz" | sed "s/[ \t]+xyz/123/"
abc xyz

(and again, also tried with \+ instead of +, and single quotes instead of double quotes, nothing helps)


回答1:


As seen in SuperUser's How to match whitespace in sed?:

For POSIX compliance, use the character class [[:space:]] instead of \s, since the latter is a GNU sed extension

So you are probably running a non-GNU sed version, hence \s not working to you.

You have two solutions:

  • To use (space) and \t together, like you were doing.
  • To use [[:space:]].



回答2:


echo 'abc xyz<>abcxyz' | sed 's/[[:space:]]xyz/123/g'
abc123<>abcxyz
echo 'abc xyz<>abcxyz' | sed "s/[[:space:]]xyz/123/g"
abc123<>abcxyz

doesn't work on very old sed version but fine on GNU sed as posix complaint (AIX, ...)



来源:https://stackoverflow.com/questions/30028823/sed-in-bash-works-with-t-but-not-with-s

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!