我在处理
的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'
我正在使用''什么时候它可以从字面上理解它""何时需要打印变量
在我看来,这应该有效。但我错过了我的错误
答案 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
手册确实列出了i
和I
作为不区分大小写的选项,所以这应该不是问题。另一种可能性是${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