linux sed unknown option to 's',sed unknown option to `s' in bash script [duplicate]

问题

This question already has an answer here:

sed fails with “unknown option to `s'” error

(1 answer)

Closed 5 years ago.

Im having a bit of trouble putting together a bash script im working on

Here is the code im using.

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

The odd thing is the lines work individually out of the script. but when inside the script i get this

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

I am using '' when it can take it literally and "" when it needs to print the variable

It seems to me this should be working. But im lost as to where my error is

回答1:

One of the values contains a slash. You need to escape it, or use a different delimiter.

Additionally, you are needlessly stringing together multiple invocations where a single one would do. The cat is also useless.

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

Unfortunately, not all sed dialects are compatible. If yours doesn't like multiple -e options, try a single string of newline-separated sed commands. I'm providing the second script in this syntax as an example.

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

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

If your values could contain @ or ! as well, you will need to pick a different delimiter. Any nonalphanumeric ASCII character will do, but backslash and quotes are obviously problematic.

回答2:

Leave the cats out of this; they're happier curled up in a corner and left in peace. The first sed in each pipeline can read the file.

You should be able to combine those separate sed commands into one per pipeline, too. That is, your current command:

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

should be:

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

This ignores the issue with the unknown option to the s/// command, which is probably might be referring to the i flag. The GNU sed man page on Linux doesn't list that, but the online GNU sed manual does list both i and I as options for case-insensitivity, so that should not be the problem. One other possibility is that the expansion of ${PORT} contains a slash; that could cause the error you're seeing (or, that the problem is in the second pipeline instead of the first).

If you are not using GNU sed (and the error suggests that you might not be), you might need to brute-force the patterns.

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

Note that both these pipelines will fail horribly if the current directory is /crawler because the output redirection will clobber the input file before the command is executed.

回答3:

One possible thing is that i may not be recognized by the sed you use that you have no choice but to remove it:

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

(kunwar.sangram suggests that the uppercase I may be recognized instead.)

Another thing is that some of your variables may contain the delimiter you use to s, so perhaps trying to use another delimiter may fix it:

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

回答4:

Try

cat /crawler/bc_layout.php | \

sed "s/GITHUB/${REPO}/gI" | \

sed "s/COINNAME/${NAME}/gI" > bc_layout.php

来源:https://stackoverflow.com/questions/24705650/sed-unknown-option-to-s-in-bash-script

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值