在shell脚本中使用sed替换不起作用

时间:2013-12-27 13:57:01

标签: linux bash .htaccess shell sed

我已经制作了一个安装脚本,它基本上在 RewriteEngine On 行之后插入一些 RewriteRule ,在shell脚本中使用sed

#!/bin/bash

REWRITE_RULE="RewriteRule \^catalog\/category\/view\/id\/([0-9]+)$ http:\/\/localhost\/app\/#?c=$1 [NE,L,R=301]"
FILE_PATH=".htaccess"

sed -i "s/RewriteEngine on/RewriteEngine on\n\n$REWRITE_RULE/g" $FILE_PATH

它什么也没做,只是给出了一些像

这样的错误
  

:没有这样的文件或目录

我在shell中尝试了相同的命令,它没有任何问题,并更新了我的 .htaccess 文件

我是shell脚本的新手,所以不知道通过shell和脚本使用相同命令的区别..请指导

2 个答案:

答案 0 :(得分:2)

脚本本身很好。您确定上面发布的行是完全从您的脚本中获取它们吗?

错误消息表明您提供了一个空名称作为文件名,因此我建议您添加一个

echo "FILE_PATH: $FILE_PATH"

直接在sed命令之前,以检查变量是否设置正确。

答案 1 :(得分:1)

您会发现由于使用DOS行尾字符保存,您的脚本包含回车符。使用tr -d '\r' <brokenscript >fixedscript修复脚本。

以下是复制和修复问题的会话副本:

$ cat file
var=foo

$ cat myscript
sed -i s/foo/bar/ file

$ bash myscript
: No such file or directory

$ shellcheck myscript

In myscript line 1:
sed -i s/foo/bar/ file
                      ^-- SC1017: Literal carriage return. Run script through tr -d '\r' .

$ tr -d '\r' < myscript > fixedscript

$ bash fixedscript

$ cat file
var=bar

$