分享一个sed 命令 在不同系统的一个小细节.
今天用sed 报了一下错误
报错如下
sed: 1: ".pip/pip.conf": invalid command code .
frankdeMacBook-Pro:~ frank$ cat .pip/pip.conf
[global]
require-virtualenv = true
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
require-virtualenv = true
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
现在 我想 用sed 把 前面 global ,install 模块注释掉,
正常的话,一行sed 替换就可以了.
sed '1,7s/^/#/' .pip/pip.conf
查看一下结果:
frankdeMacBook-Pro:~ frank$ sed '1,7s/^/#/' .pip/pip.conf
#[global]
#require-virtualenv = true
#index-url = http://mirrors.aliyun.com/pypi/simple/
#
#
#[install]
#trusted-host = mirrors.aliyun.com
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
require-virtualenv = true
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
而当我加上 -i 去替换的时候.
invalid command code
frankdeMacBook-Pro:~ frank$ sed -i '1,7s/^/#/' .pip/pip.conf
sed: 1: ".pip/pip.conf": invalid command code .
frankdeMacBook-Pro:~ frank$
发现不能执行.
查文档 发现要这样写:
...skipping...
-i extension
Edit files in-place, saving backups with the specified
extension. If a zero-length extension is given, no backup will
be saved. It is not recommended to give a zero-length extension
when in-place editing files, as you risk corruption or partial
content in situations where disk space is exhausted, etc.
-i 本来的意思就原地替换的意思, 为啥不能替换呢? 一般情况 原地替换是比较危险的行为, 为了规避这样的行为, 需要你提供一个 备份的扩展名, 才能进行替换. 如果你给了空的扩展,就不会备份源文件. 但这不是推荐的方式. 因为 你面临这损坏或者部分损坏的危险 恰巧当磁盘空间用完的时候.
来加上扩展名 来试验一下
cd /Users/frank/.pip
sed -i ".bak" '1,7s/^/#/' pip.conf
此时 就会发现 一个备份文件
.
├── pip.conf
├── pip.conf.bak
如果不想备份的话, 可以不提供扩展名称. 加上一个双引号即可.
cd /Users/frank/.pip
sed -i "" '1,7s/^/#/' pip.conf
#[global]
#require-virtualenv = true
#index-url = http://mirrors.aliyun.com/pypi/simple/
#
#
#[install]
#trusted-host = mirrors.aliyun.com
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
require-virtualenv = true
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
frankdeMacBook-Pro:2222 frank$ cp pip.conf pip.conf.frank
frankdeMacBook-Pro:2222 frank$ sed -i'.bak' '1,7s/^/#/' pip.conf
frankdeMacBook-Pro:2222 frank$ tree .
.
├── pip.conf
├── pip.conf.bak
└── pip.conf.frank
0 directories, 3 files
frankdeMacBook-Pro:2222 frank$ sed -i '.bak22' '1,7s/^/#/' pip.conf
frankdeMacBook-Pro:2222 frank$ tree .
.
├── pip.conf
├── pip.conf.bak
├── pip.conf.bak22
└── pip.conf.frank
0 directories, 4 files
frankdeMacBook-Pro:2222 frank$ sed -i ".bak33" '1,7s/^/#/' pip.conf
frankdeMacBook-Pro:2222 frank$ tree .
.
├── pip.conf
├── pip.conf.bak
├── pip.conf.bak22
├── pip.conf.bak33
└── pip.conf.frank
在Mac 环境下面, sed -i 就必须 加上 后缀, 如果不加就不备份, 加引号 就可以了. 这个时候要加上一个空格.
如果要备份 -i 后面可以有空格 ,或者没有都可以的. 然后后面跟后缀就可以了.
如下面的例子:
sed -i ".bak33" '1,7s/^/#/' pip.conf
sed -i'.bak22' '1,7s/^/#/' pip.conf
# 不备份
sed -i '' '1,7s/^/#/' pip.conf
# 这样好像会报错的.
sed -i'' '1,7s/^/#/' pip.conf
这样就可以了.
2 centos 下面的sed 命令
好奇心的我, 随便查了一下 linux , centos 的 sed 命令.
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
在linux -centos 下面 直接 -i , 是没有任何问题的. 这样就是直接替换原文件
sed -i '1,7s/^/#/' pip.conf
可以看出是备份的. 要指定后缀.
[pythontest@sfytest4 2222]$ sed -i 'bak' '1,7s/^/#/' pip.conf
sed: 无法为目的为“ak”的跳转找到标签
这样写 就可以了. 注意这里的区别 就是 -i 没有空格.
sed -i'.bak' '1,7s/^/#/' pip.conf
下面演示一下.
[pythontest@sfytest4 2222]$ sed -i '.bak' '1,7s/^/#/' pip.conf
sed:-e 表达式 #1,字符 1:未知的命令:“.”
[pythontest@sfytest4 2222]$ sed -i'.bak' '1,7s/^/#/' pip.conf
[pythontest@sfytest4 2222]$ cat pip.conf
#[global]
#require-virtualenv = true
#index-url = http://mirrors.aliyun.com/pypi/simple/
#
#
#[install]
#trusted-host = mirrors.aliyun.com
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
require-virtualenv = true
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
[pythontest@sfytest4 2222]$ tree .
.
├── pip.conf
└── pip.conf.bak
就是Centos的环境 替换的话. -i 想要备份的话, 需要注意 -i后面不能有空格.
最后补充一个 sed 替换技巧
如果想在开头加#
sed -i "" '1,7s/^/#/' pip.conf
如果想去掉开头的#
sed -i "" '1,7s/^#//' pip.conf
这里 1,7s 意思是在第1行到第7行开始替换. 如果不加 就是整篇文章替换.
总结
主要是 说一下 sed 命令 遇到一些细节问题. 主要 是Centos 和Mac 下面的环境不一样, 导致 sed 稍微有些区别. centos 下面 直接-i 就可以直接替换, 而Mac 要求要给一个后缀,也是保证安全.
<center> 分享快乐,留住感动. 2019-05-11 12:10:50 --frank </center>