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