在bash脚本中使用's'的未知选项

时间:2014-07-11 20:03:28

标签: bash sed

我在处理

的bash脚本时遇到了一些麻烦

这是我正在使用的代码。

cat /crawler/bc_daemon.php | sed "s/PORT2/${PORT}/ig" | sed 's/IP2/IPADDRESS/ig' | \
   sed 's/USER2/USER/ig' | sed 's/PASS2/PASSWORD/ig' > bc_daemon.php

cat /crawler/bc_layout.php | sed "s/GITHUB/${REPO}/ig" | sed "s/COINNAME/${NAME}/ig" > bc_layout.php

奇怪的是线条单独从脚本中运行。但是在剧本里面我得到了这个

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

我正在使用''什么时候它可以从字面上理解它""何时需要打印变量

在我看来,这应该有效。但我错过了我的错误

4 个答案:

答案 0 :(得分:10)

其中一个值包含斜杠。你需要逃避它,或使用不同的分隔符。

此外,您不必要地将多个调用串联在一起。 cat也没用。

sed -e "s@PORT2@${PORT}@ig" \
    -e 's/IP2/IPADDRESS/ig' \ 
    -e 's/USER2/USER/ig' \
    -e 's/PASS2/PASSWORD/ig'  /crawler/bc_daemon.php > bc_daemon.php

不幸的是,并非所有sed方言都兼容。如果您不喜欢多个-e选项,请尝试使用一行换行符sed命令。我在这个语法中提供了第二个脚本作为示例。

sed "s!GITHUB!${REPO}!ig
    s!COINNAME!${NAME}!ig"  /crawler/bc_layout.php > bc_layout.php

如果您的值也可以包含@!,则需要选择不同的分隔符。任何非字母数字的ASCII字符都可以,但反斜杠和引号显然有问题。

答案 1 :(得分:3)

离开cat s;他们更加快乐地蜷缩在一个角落里,安静地离开了。每个管道中的第一个sed可以读取该文件。

您应该能够将这些单独的sed命令组合到每个管道中。也就是你当前的命令:

cat /crawler/bc_daemon.php |
sed "s/PORT2/${PORT}/ig" |
sed 's/IP2/IPADDRESS/ig' |
sed 's/USER2/USER/ig' |
sed 's/PASS2/PASSWORD/ig' > bc_daemon.php

应该是:

sed -e "s/PORT2/${PORT}/ig" \
    -e 's/IP2/IPADDRESS/ig' \
    -e 's/USER2/USER/ig' \
    -e 's/PASS2/PASSWORD/ig' \
    /crawler/bc_daemon.php > bc_daemon.php

这忽略了s///命令的未知选项的问题,可能可能指的是i标志。 Linux上的GNU sed手册页并没有列出,但在线GNU sed手册确实列出了iI作为不区分大小写的选项,所以这应该不是问题。另一种可能性是${PORT}的扩展包含斜线;这可能会导致您看到的错误(或者问题是在第二个管道而不是第一个管道中)。

如果你没有使用GNU sed(并且错误暗示你可能不是),你可能需要暴力破解模式。

sed -e "s/[pP][oO][rR][tT]2/${PORT}/g" \
    -e 's/[iI][pP]2/IPADDRESS/g' \
    -e 's/[uU][sS][eE][rR]2/USER/g' \
    -e 's/[pP][aA][sS][sS]2/PASSWORD/g' \
    /crawler/bc_daemon.php > bc_daemon.php

请注意,如果当前目录为/crawler,这两个管道都将失败,因为输出重定向将在执行命令之前破坏输入文件。

答案 2 :(得分:1)

可能的一点是i可能无法识别您使用的sed,除了将其删除之外别无选择:

sed "s/GITHUB/${REPO}/g"

kunwar.sangram表示可能会识别出大写的I。)

另一件事是你的一些变量可能包含你用于s的分隔符,所以也许尝试使用另一个分隔符可能会修复它:

sed "s|GITHUB|${REPO}|ig"

答案 3 :(得分:0)

尝试

cat /crawler/bc_layout.php | \
sed "s/GITHUB/${REPO}/gI" | \
sed "s/COINNAME/${NAME}/gI" > bc_layout.php