Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 带有-i选项的sed命令(就地编辑)在Ubuntu上运行良好,但在Mac上不起作用_Linux_Macos_Sed_Bsd_Inplace Editing - Fatal编程技术网

Linux 带有-i选项的sed命令(就地编辑)在Ubuntu上运行良好,但在Mac上不起作用

Linux 带有-i选项的sed命令(就地编辑)在Ubuntu上运行良好,但在Mac上不起作用,linux,macos,sed,bsd,inplace-editing,Linux,Macos,Sed,Bsd,Inplace Editing,我对Sed一无所知,但需要这个命令(在Ubuntu上运行良好)才能在Mac OSX上运行: sed -i "/ $domain .*#drupalpro/d" /etc/hosts 我得到: sed: 1: "/etc/hosts": extra characters at the end of h command 男人是你的朋友 OSX Ubuntu附带GNUsed,其中-i选项的后缀是可选的。OSX附带BSDsed,其中后缀是必需的。在OSX中,您可以使用GNU版本的sed:gsed #

我对Sed一无所知,但需要这个命令(在Ubuntu上运行良好)才能在Mac OSX上运行:

sed -i "/ $domain .*#drupalpro/d" /etc/hosts
我得到:

sed: 1: "/etc/hosts": extra characters at the end of h command
男人是你的朋友

OSX
Ubuntu附带GNU
sed
,其中
-i
选项的后缀是可选的。OSX附带BSD
sed
,其中后缀是必需的。在OSX中,您可以使用GNU版本的sed:
gsed

# if using brew
brew install gnu-sed

#if using ports
sudo port install gsed
然后,如果脚本应该是可移植的,则可以根据操作系统定义要使用的命令

SED=sed
unamestr=`uname`
if [[ "$unamestr" == "Darwin" ]] ; then
    SED=gsed
    type $SED >/dev/null 2>&1 || {
        echo >&2 "$SED it's not installed. Try: brew install gnu-sed" ;
        exit 1;
    }
fi
# here your sed command, e.g.:
$SED -i "/ $domain .*#drupalpro/d" /etc/hosts
补充:

  • 使用便携式解决方案
  • 有背景资料
tl;博士

与此GNU
sed
(大多数Linux发行版上的标准)命令等效:

sed-i的/foo/bar/”文件
这是BSD/macOS
sed
命令吗:

sed-i''s/foo/bar/'文件#请注意''作为*单独的参数*
使用BSD/macOS
sed
,以下命令根本不起作用或不符合预期:

sed-i的/foo/bar/”文件#中断;脚本被误解为备份文件后缀
sed-i''s/foo/bar/'文件#同上
sed-i-e的/foo/bar/”文件#-e被误解为备份文件后缀
有关GNU
sed
和BSD/macOS
sed
之间所有差异的讨论,请参阅我的

便携式方法

注意:这里的可移植性意味着该命令可以与讨论的两种实现一起使用。它在POSIX意义上是不可移植的,因为

#可与GNU和BSD/macOS Sed一起使用,因为有一个*非空*选项参数:
#创建备份文件*临时*并在成功后将其删除。
sed-i.bak的/foo/bar/”文件和&rm file.bak
有关解释,请参见下文;有关替代解决方案,包括兼容POSIX的解决方案,请参阅我的


背景资料 在GNU
sed
(大多数Linux发行版上的标准)和BSD/macOS
sed
中,执行就地更新的
-i
选项[1] 在其输入文件中,接受一个选项参数,该参数指定要更新的文件的备份文件使用的后缀(文件扩展名)

例如,在这两种实现中,以下内容将原始文件
file
保留为备份文件
file.bak

sed-i.bak的/foo/bar/'file#将原始文件保留为'file.bak';在-i和.bak之间没有空格
尽管,而对于,上述语法适用于两种实现,因为直接连接选项参数(
.bak
)和选项(
-i
)-
-i.bak
)的
-i.bak
相反,作为可选和强制性选项参数工作

  • Syntax
    -i.bak
    是唯一适用于可选选项参数的形式
  • 语法
    -i.bak
    也可用作强制选项参数,作为
    -i.bak
    的替代,即分别指定选项及其参数
不指定后缀(通常情况下是这样)意味着不应保留备份文件,而这正是导致不兼容的原因:

  • 对于GNU
    sed
    ,不指定后缀意味着只需自己使用
    -i

  • 对于BSD/macOS
    sed
    ,不指定后缀意味着将空字符串指定为-mandatory-后缀,出于技术原因,空字符串只能作为单独的参数传递:即,
    -i'
    而不是
    -i'

-i'
不起作用,因为to
sed
与just
-i
是无法区分的,因为shell有效地删除了空引号(它将
-i
'
连接起来,并使用语法函数删除引号),并且在这两种情况下都只传递
-i

如果(有效地)只指定了
-i
,则下一个参数将被解释为选项参数:

sed-i's/foo/bar/'文件#与BSD/macOS sed中断
's/foo/bar/'
-用于Sed脚本(命令)-现在被解释为后缀,单词
file
被解释为脚本。
将这样的单词解释为脚本会导致模糊的错误消息,如
sed:1:“文件”:无效的命令代码f

因为
f
被解释为Sed命令(函数)

同样,与:

sed-i-e's/foo/bar/'file#创建备份文件'file-e'
-e
被解释为后缀参数,而不是Sed的
-e
选项(如果需要,可用于指定多个命令)。
因此,将得到一个后缀为
-e
的备份文件,而不是不保留任何备份

如果
-e
参数满足后缀参数的语法要求,那么该命令不能按预期工作就不那么明显了,因为就地更新确实成功

这些备份文件的意外创建很容易被忽略,这是(在撰写本文时)获得如此多赞成票的最有可能的解释



[1] 严格来说,在幕后创建一个临时文件,然后替换原始文件;这种方法可能会有问题:请参阅我的下半部分。

因此只需使用单引号跟随sed-i,sed-i'1i export PATH=“$HOME/.composer/vendor/bin:$PATH””$HOME/.bashrc仍然不适用于me@pal4life关键是在启动命令之前需要一组单独的引号,所以类似于
sed
SED=sed
unamestr=`uname`
if [[ "$unamestr" == "Darwin" ]] ; then
    SED=gsed
    type $SED >/dev/null 2>&1 || {
        echo >&2 "$SED it's not installed. Try: brew install gnu-sed" ;
        exit 1;
    }
fi
# here your sed command, e.g.:
$SED -i "/ $domain .*#drupalpro/d" /etc/hosts