问题
由于sed中替换的字符串是一个路径,因此报错
sed: -e expression #1, char 20: unknown option to `s'
问题分析
我们使用sed
来替换文本文件中的指定字符串,它的一般语法如下:
sed 's/oldstring/newstring/' file
如果string中包含特殊字符,则需要用\进行转义,比如
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'
,使用#代替/从而避免大量转义。
sed -i "s#local_config_path#"$LOCAL_CONFIG_PATH"#g" $DOCKER_COMPOSE_PATH"/"$COPY_FILE_NAME