用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
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"sed: command not found" 是一个常见的错误消息,它表示在当前环境中找不到 sed 命令。sed 是一个流编辑器,用于对文本进行处理和转换。它在大多数类Unix系统中都是默认安装的,但在某些情况下可能会出现找不到的情况。 如果你遇到了这个错误,有几种可能的原因和解决方法: 1. sed 没有安装:首先,你需要确认 sed 是否已经安装在你的系统上。你可以尝试在终端中运行 `sed --version` 命令来检查是否安装。如果没有安装,你可以使用包管理器来安装 sed。例如,在Ubuntu上,你可以运行 `sudo apt-get install sed` 命令来安装 sed。 2. 环境变量问题:如果 sed 已经安装,但仍然出现 "sed: command not found" 错误,那么可能是由于环境变量配置不正确导致的。你可以尝试使用绝对路径来运行 sed 命令,例如 `/usr/bin/sed`。如果这样可以正常运行,那么你需要检查你的环境变量配置,确保包含了 sed 的路径。 3. 权限问题:如果你是在一个受限制的用户账户下运行命令,并且没有足够的权限来执行 sed 命令,那么也会出现 "sed: command not found" 错误。你可以尝试切换到具有足够权限的用户账户,或者联系系统管理员来解决权限问题。 总结一下,"sed: command not found" 错误通常是由于 sed 没有安装、环境变量配置问题或权限问题导致的。你可以根据具体情况来检查和解决这些问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值