【问题标题】:Sed in place replacement on Mac [duplicate]Mac上的Sed就地替换[重复]
【发布时间】:2015-10-27 19:05:47
【问题描述】:

这是一个关于 Mac 上的 sed 的问题,它需要一个长度为零的字符串来就地替换而无需备份文件。

#!/usr/bin/env bash -x

SEDOPT='-i "" '
echo $SEDOPT
sed $SEDOPT -e "s/a/a/g" filename.txt
sed "$SEDOPT" -e "s/a/a/g" filename.txt
sed -i "" -e "s/a/a/g" filename.txt

如果你执行上面的命令,你会得到类似的输出

1|+ SEDOPT='-i "" '
2|+ echo -i '""'
3|-i ""
4|+ sed -i '""' -e s/a/a/g filename.txt
5|+ sed '-i "" ' -e s/a/a/g filename.txt
6|+ sed -i '' -e s/a/a/g filename.txt

我正在设置一个 sed 选项变量 SEDOPT,它将根据发行版进行更改。

有人可以帮助我使第 4 行和第 5 行的输出表现得像第 6 行吗? 谢谢。

【问题讨论】:

    标签: macos bash sed


    【解决方案1】:

    引号不会按照您期望的方式嵌套。使用数组来存储参数。

    SEDOPT=( -i "" )
    sed "${SEDOPT[@]}" -e "s/a/a/g" filename.txt
    

    随行

    sed -i "" ...
    

    sed 的前两个参数是-i 和空字符串; bash 在其评估命令行的 引号删除 阶段删除双引号。

    有代码

    SEDOPT='-i ""'
    sed $SEDOPT ...
    

    变量SEDOPT 扩展为一个包含文字空格和两个双引号的字符串。结果会受到分词(删除空格,留下两个单独的词 -i"" 代替原始字符串 -i ""),但 引号删除,所以文字字符串 "" 作为第二个参数传递给 sed

    【讨论】:

    • 谢谢,这困扰了我两天。我是一个业余爱好者,不想使用数组来传递参数。
    猜你喜欢
    • 2017-01-06
    • 2012-06-04
    • 2019-10-13
    • 2021-09-14
    • 1970-01-01
    • 2018-11-25
    • 2014-08-08
    • 2010-11-29
    • 2015-06-26
    相关资源
    最近更新 更多