用sed 報了一下錯誤 invalid command code

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

分享快樂,留住感動. 2019-05-11 12:10:50 --frank
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章