分享一個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 要求要給一個後綴,也是保證安全.