bash - Sed 问题 - 替代命令中的错误标志:'#'
问题描述
我在我的团队继承的 mac 中运行一个脚本,它有一些似乎没有正常运行的替换代码。我尝试了各种替代字符,如 %、\ 等,但似乎没有任何效果。有人可以告诉我我还应该改变什么。
脚本是这样运行的
./test.sh /Users/Apple/Test_Folder/ 425323 C6C7CB 425363 425363 425363 666666 666666 425363 425363 666666 425363 425363 a0a9b1 687582 a0a9b2
脚本(test.sh)中的问题是这个for循环
for f in "$1"/*.svg;
do
sed -i '' 's\#000002\#'"$2"'/g;s\#000003\#'"$3"'/g;s\#000004\#'"$4"'/g;s\#000005\#'"$5"'/g;s\#000006\#'"$6"'/g;s\#000007\#'"$7"'/g;s\#000008\#'"$8"'/g;s\#000009\#'"$9"'/g;s\#000010\#'"$10"'/g;s\#000011\#'"$11"'/g;s\#000012\#'"$12"'/g;s\#000013\#'"$13"'/g;s\#000014\#'"$14"'/g;s\#000015\#'"$15"'/g;s\#000016\#'"$16"'/g' $f
done
我得到的错误是 sed:1:“s%#000002%#425323/g;s%# ...”:替代命令中的错误标志:'#'
任何指针?
谢谢,拉姆
解决方案
重新格式化,使其更易于阅读、查找和编辑。使用双引号作为脚本分隔符,这样您就不需要这么多变通方法。
for f in "$1"/*.svg;
do
sed -i "
s/#000002/#$2/g;
s/#000003/#$3/g;
s/#000004/#$4/g;
s/#000005/#$5/g;
s/#000006/#$6/g;
s/#000007/#$7/g;
s/#000008/#$8/g;
s/#000009/#$9/g;
s/#000010/#$10/g;
s/#000011/#$11/g;
s/#000012/#$12/g;
s/#000013/#$13/g;
s/#000014/#$14/g;
s/#000015/#$15/g;
s/#000016/#$16/g;
" $f
done
如果您对大量抽象感到满意,您可以尝试这样的事情,但请确保您对其进行大量测试......
for s in $(seq 2 16)
do n="$(printf "%06d" $s)"
script="$script s/#$n/#\${$s}/g; "
done
for f in "$1"/*.svg;
do eval " sed -i \" $script \" \"$f\" "
done
推荐阅读
- python - AttributeError:模块“pandas.compat”没有属性“iteritems”
- list - 需要比较列表中可用的日期
- ruby-on-rails - Rails 应用程序的部署:在第一次部署期间应该如何加载和填充数据库?
- c# - RestSharp - 带有“$”响应属性名称的 GET 请求
- google-bigquery - 如何在 BigQuery TIMESTAMP 字段上使用 LIKE 运算符
- docker - 如何将应用程序容器连接到 mysql 容器
- ansible - Ansible - 迭代库存组
- java - 如何使用 ByteBuddy 拦截方法,就像在 CGLIB 中使用 MethodInterceptor 调用 MethodProxy.invokeSuper(...)
- javascript - 无法将侦听器添加到由另一个按钮创建的按钮
- swift - 如何快速将下载文件转发到我的应用程序?