在Mac上的Sed替换位置

时间:2015-10-27 19:05:47

标签: macos bash sed

这是关于 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行吗? 谢谢。

1 个答案:

答案 0 :(得分: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