完美解决mac环境使用sed修改文件出错的问题

sed是linux命令,用于处理文件内容(修改,替换等),mac中都可以使用,但发现相同的替换命令在linux可以正常执行,在mac则执行失败。

出错原因

用shell写了个更新Config/Config.php版本的脚本,代码如下:

#!/bin/bash

file='Config/Config.php'
old_version='1.1.0'
new_version='1.1.1'

#替换配置文件版本
sed -i "s/$old_version/$new_version/g" "$file"

exit 0
在linux执行正常,但在mac环境下执行出现以下错误:

$ cat ./Config/Config.php
// 版本
define('VERSION', 1.1.0);

$ ./update_config.sh
sed: 1: "Config/Config.php": invalid command code C

man sed 查看原因,找到 -i 参数的说明

-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.

原来sed -i需要带一个字符串作为备份源文件的文件名称,如果这个字符串长度为0,则不备份。

例如执行

sed -i "_bak" "s/a/b/g" "example.txt"

则会创建一个example.txt_bak的备份文件,文件内容为修改前的example.txt内容

实例

1、如果需要备份源文件,update_config.sh修改为

#!/bin/bash

file='Config/Config.php'
old_version='1.1.0'
new_version='1.1.1'

#替换配置文件版本
sed -i "_bak" "s/$old_version/$new_version/g" "$file"

exit 0

执行结果

$ cat ./Config/Config.php
// 版本
define('VERSION', 1.1.0);

$ ./update_config.sh 

$ cat ./Config/Config.php
// 版本
define('VERSION', 1.1.1);

$ cat ./Config/Config.php_bak
// 版本
define('VERSION', 1.1.0);

执行前会备份源文件到Config.php_bak

2、如果不需要备份,把update_config.sh修改为

#!/bin/bash

file='Config/Config.php'
old_version='1.1.0'
new_version='1.1.1'

#替换配置文件版本
sed -i "" "s/$old_version/$new_version/g" "$file"

exit 0
执行结果

$ cat ./Config/Config.php
// 版本
define('VERSION', 1.1.0);

$ ./update_config.sh

$ cat ./Config/Config.php
// 版本
define('VERSION', 1.1.1);

以上这篇完美解决mac环境使用sed修改文件出错的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 完美解决mac环境使用sed修改文件出错的问题

    sed是linux命令,用于处理文件内容(修改,替换等),mac中都可以使用,但发现相同的替换命令在linux可以正常执行,在mac则执行失败. 出错原因 用shell写了个更新Config/Config.php版本的脚本,代码如下: #!/bin/bash file='Config/Config.php' old_version='1.1.0' new_version='1.1.1' #替换配置文件版本 sed -i "s/$old_version/$new_version/g" &

  • 完美解决beego 根目录不能访问静态文件的问题

    beego可算是Go框架里面文档最多的了.学起来比较容易.但是框架自身的局限性却带了不小的问题. 最近我在处理flash跨域问题上就遇到个活生生的例子: flash里面的as3访问外网时没啥问题.可是假如通过网页调取的情况下,flash访问的外网又与所在网页不是一个域的.就会产生跨域问题.打开浏览器,f12之后,看到的就是flash没有访问你的url,而是访问了这个url所在的域名根目录下的配置文件crossdomain.xml.该配置文件来设置跨域访问的权限. 这时候需要在你的域名根目录下放个

  • 完美解决keras 读取多个hdf5文件进行训练的问题

    用keras进行大数据训练,为了加快训练,需要提前制作训练集. 由于HDF5的特性,所有数据需要一次性读入到内存中,才能保存. 为此,我采用分批次分为2个以上HDF5进行存储. 1.先读取每个标签下的图片,并设置标签 def load_dataset(path_name,data_path): images = [] labels = [] train_images = [] valid_images = [] train_labels = [] valid_labels = [] counte

  • Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文标点输入无效的完美解决方法

    Mac OS X 下基于 Java 的程序(如 IntelliJ IDEA.jEdit 等)会出现中文标点输入无效的问题,在中文输入法状态,可以输入中文字,但输入中文标点最后上去的是英文标点.查阅了相关资料,原来这是 Java 自己的 bug.从 Java 8u51 版本开始就出现了这个 bug,一直到现在最新的 Java 8u72 仍然如此,但是老版本 Java 8u45 是没有这个问题的.所以,可以采取变通的方法,在 Mac OS X 上同时装一个老版本的 JDK 8u45,不会影响已经安装

  • mac 安装omyzsh后不执行~/.bash_profile、~/.bashrc的完美解决办法

    mac 安装 omyzsh 后, terminal瞬间逼格飙升! 但是! terminal init的时候并不会执行~/.bash_profile.~/.bashrc等脚本了, 这是因为其默认启动执行脚本变为了-/.zshrc. 解决办法就是修改-/.zshrc文件,在其中添加: source -/.bash_profile.-/.bashrc等脚本文件就ok了 以上所述是小编给大家介绍的mac 安装omyzsh后不执行~/.bash_profile.~/.bashrc的完美解决办法,希望对大家

  • 完美解决mysql启动后随即关闭的问题(ibdata1文件损坏导致)

    机房一台服务器上的mysql运行一段时间了,突然出现了一个很奇怪的现象:重启后无法恢复了!准确情况是:启动mysql后随即就又关闭了. 查看mysql错误日志如下: 160920 22:41:41 mysqld_safe Starting mysqld daemon with databases from /home/MysqlData/ 2016-09-20 22:41:41 0 [Note] /Data/app/mysql5.6.25/bin/mysqld (mysqld 5.6.25-lo

  • 完美解决安卓jni项目会删除其他so文件的问题

    安卓项目开发中,项目中使用到jni开发,使用C/C++编写了自己的so库,调试和运行一切正常,Android.mk文件代码如下: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:=observer LOCAL_SRC_FILES:=observer.c LOCAL_C_INCLUDES:= $(LOCAL_PATH)/include LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog

  • 完美解决go Fscanf 在读取文件时出现的问题

    先要明白Fscanf的工作原理 Fscanf在遇到\n才结束 遇到\r时就会把\r替换成0 这就有个问题,要注意自己的文本换行符是什么,在Windows下就是\r\n,在Linux,Mac下就是\n,也就是说这里有个坑, 代码在Linux和Mac下读取数据文件是正常的,在Windows下就会遇到各种行末尾有个0,网上办法用什么替换啊,用什么自定义Scan函数啊,太麻烦了,直接使用自带IDE将打开的数据文件集换行符改成LF(Linux,Mac换行符)就行了 如下图Idea 文件右下角LF点击就可以

  • mac 系统下使用 chmod 命令修改文件权限

    PC 端修改文件访问权限算是比较常用的操作,在安装部分软件时经常需要使用到.在 Mac 系统的终端上修改文件权限使用的是 Linux 中的 chmod 命令.这里详细介绍一下该命令的相关使用. 也可以直接通过 man chmod 在终端工具上查看该命令的帮助手册. 查看文件权限 ls -l 命令可以查看当前目录下所有文件的访问权限,也可以查看指定文件.比如,查看 Tomcat bin 目录中的 startup.sh 文件的访问权限时: yifeng:bin yifeng$ ls -l start

  • 完美解决java读取大文件内存溢出的问题

    1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 实际上是使用BufferedReader或者其子类LineNumberReader来读取的. 传统方式的问题: 是文件的所有行都被存放在内存中,当文件足够大时很快就会

随机推荐