sed搜索字符串中的空格

时间:2015-07-01 12:54:39

标签: regex bash shell sed

我想用以下文件替换字符串:

#     - "server1"

我的第一次尝试是这样的:

sed -i 's/#\     -\ "\server1"\.*/ChangedWord/g' file

但如果我这样试试,我会收到错误。

所以还有另一种处理空格的方法,我想我必须使用\ s或[[:space:]]。但对于一些人来说,我无法使其发挥作用。

3 个答案:

答案 0 :(得分:4)

我认为你的表达太复杂了。这应该足够了:

sed 's/^#[[:space:]]*-[[:space:]]*"server1".*/ChangedWord/' file

它查找那些以#开头,后跟0到n空格,然后是"server1"然后是任何内容的行。在这种情况下,它会将行替换为ChangedWord

注意我使用[[:space:]]来匹配空格,因为它是一种更兼容的方式(感谢Tom Fenech的评论)。

另请注意,g表达式中不需要使用sed,因为每行只能出现一次模式。

测试

$ cat a
hello
#     - "server1"
hello#     - "server1"
$ sed 's/^#[[:space:]]*-[[:space:]]*"server1".*/ChangedWord/' a
hello
ChangedWord
hello#     - "server1"

答案 1 :(得分:1)

实际的错误是从双引号中逃脱的缺失:

 ssh -i file root@IP sed 's/^#[[:space:]]*-[[:space:]]*\"server1\".*/ChangedWord/' file

那为我做了。感谢您的支持

答案 2 :(得分:0)

rghome是对的,因为表达式用引号括起来,所以你不需要在空格前面使用那些反斜杠。实际上,它们会导致错误:sed告诉您\<Space>不是有效选项。只需删除它们,它应该按预期工作:

sed -i 's/#     - "server1"/ChangedWord/' file