sed 命令无法正确替换

sed 命令无法正确替换

在脚本 job.sh 中我有这个字符串:

/home/myname/code_DEM/ > output.txt

我想用以下内容代替:

/home/myname/code_DEM/ > output_"$datetime".txt

其中 $datetime 是自动加载日期和时间的字符串。

我尝试使用 sed 命令来执行此操作

sed -i 's/"$LINEout"/"$LINEnew"/' job.sh

$LINEout我想要替换的旧字符串在哪里$LINEnew,新字符串(带有日期和时间的字符串)在哪里。

到现在为止,我都得不到我想要的,我没有任何改变。

PS:如果有人有适用于 Linux 和 MacO 的解决方案,那就太好了:我相信 sed 命令的语法从 Linux 到 Mac 略有不同:)

答案1

试试这个:

sed -i "s|$LINEout|$LINEnew|" job.sh

如果在 macOS 下你需要指定备份,那么你必须使用这个:

sed -i "" "s|$LINEout|$LINEnew|" job.sh

例子:

echo "foo
bar" > sample
cat sample 
foo
bar

rep=bar
sed -i.bak "s|$rep|baz|" sample
cat sample
foo
baz
cat sample.bak 
foo
bar

使用 macOS X 10.11.6 和 BSD sed 进行测试

答案2

请注意,BSD(如 Apple OS/X)使用sed -i '' ...无需备份的就地编辑,而 GNU 使用sed -i ....在大多数其他系统上,sed不支持就地编辑。

perl两者都是从的选项中得到的-i。因此,为了可移植性,您可能希望恢复为perl,这也将解决变量中特殊字符的问题:

A=$LINEout B=$LINEnew perl -i -pe 's/\Q$ENV{A}\E/$ENV{B}/g' job.sh

答案3

好的找到了。感谢@maulinglawns 的点击;)事实上,分隔符需要更改,以便:

sed -i "s:$LINEout:$LINEnew:" job.sh

相关内容