我已经运行了以下命令:
sed 's/http:\/\//www/' filename
在输出中,此命令没有将“http://”替换为“www”,为什么?
以及如何更改sed
命令中的分隔符?
答案1
如果您只想用以下命令替换http://
该行中第一次出现的www
:,则您的原始命令是可以的
$ cat file.txt
foo http:// bar http:// spam
egg http:// test http://
$ sed 's/http:\/\//www/' file.txt
foo www bar http:// spam
egg www test http://
现在,由于您想要用 替换所有出现的http://
,只需在末尾www
添加修饰符:g
$ sed 's/http:\/\//www/g' file.txt
foo www bar www spam
egg www test www
如果要设置除分隔符之外的字符,您可以选择对测试用例/
没有特殊含义且更容易实现的字符,例如下划线( )在这种情况下将是不错的选择:sed
_
$ sed 's_http://_www_g' file.txt
foo www bar www spam
egg www test www
如果您想要修改原始文件并改变其内容,则需要-i
选择就地编辑文件:
$ sed -i 's_http://_www_g' file.txt
如果您想同时备份原始文件:
$ sed -i.bak 's_http://_www_g' file.txt
该操作后,原文件将保留为file.txt.bak
,修改后的文件将保留为file.txt
。
答案2
这实际上不会替换现有文件的内容,您需要将输出重定向到文件。
sed 's/http:\/\//www/' filename > filename.new
或者使用 -i 选项,
sed -i.bak 's/http:\/\//www/' filename
这将复制该文件并将其扩展名为 .bak,然后用命令的输出覆盖原始文件sed
。
.
另外,这也会让您在域名之间没有空间,可能想.
在 www 之后删除一个。
编辑:关于分隔符的问题,请查看这里。给出了示例,
基本上, sed 将“s”后面的内容作为分隔符。
sed 's_/a/b/c/_/d/e/f/_'
在这个例子中_
是分隔符。