我想用以下文件替换字符串:
# - "server1"
我的第一次尝试是这样的:
sed -i 's/#\ -\ "\server1"\.*/ChangedWord/g' file
但如果我这样试试,我会收到错误。
所以还有另一种处理空格的方法,我想我必须使用\ s或[[:space:]]。但对于一些人来说,我无法使其发挥作用。
答案 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