问题

由于sed中替换的字符串是一个路径,因此报错

  1. sed: -e expression #1, char 20: unknown option to `s'

问题分析

我们使用sed来替换文本文件中的指定字符串,它的一般语法如下:

sed 's/oldstring/newstring/' file

如果string中包含特殊字符,则需要用\进行转义,比如

  1. sed -i 's/^filename=.*/filename=\/dev\/nvme1n1/' ./ebs_*.fio

更好的解决方案

转义会降低可读性,只需用其他特殊字符作为sed表达式的“分隔符”(取代默认的/)即可。

通过学习sed命令,我发现它有一个很好的设计,就是表达式本身的语法非常灵活。当用户不方便转义字符串中的特殊字符(如/)时,sed支持使用自定义分隔符,让用户避开冲突。

用户自定义语法的分隔符很简单,就是在s的后面紧跟自定义的分隔符即可。经过尝试,自定义的分隔符可以为%、$、@、?、#等等不会冲突的字符……大家可以简单尝试一下就可以掌握,非常方便!

echo aabbccdd | sed 's#aa#bb#g' | sed 's?bb?cc?g' | sed 's@cc@dd@g' | sed 's%dd%ee%g' 可谓总有一款适合你……

因此,只要把脚本改为下面的样子,就可以顺利执行,非常简单:

例如:sed 's#CONFIG#/etc/app/config.yaml#g',使用#代替/从而避免大量转义。

  1. sed -i "s#local_config_path#"$LOCAL_CONFIG_PATH"#g" $DOCKER_COMPOSE_PATH"/"$COPY_FILE_NAME