Bash问题:sed:-e表达式#1,char 16:未知选项`s'

时间:2017-09-29 17:31:01

标签: bash shell curl sed

我正在尝试传递curl请求和来自回复正文,我正试图寻找一个关键词" coin"。如果" coin"单词匹配,我需要得到" 0"或" 1"输入网址为prefix(逗号delineated)。

$for i in $(cat small);do curl -i -H "Accept: application/json" $i | grep "coin";echo $? | sed "s/^\(.\)/$i,\1/";done

#cat small

http://cuevana0.tv/
https://www.1111data.com/

我添加输入作为结果的前缀" sed" s /^(.)/$ i,\ 1 /"。

但我的错误是

$ for i in $(cat small);do curl -i -H "Accept: application/json" $i | grep "coin";echo $? | sed "s/^\(.\)/$i,\1/";done
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  633k    0  633k    0     0   909k      0 --:--:-- --:--:-- --:--:--  908k
    <script src="https://coin-hive.com/lib/coinhive.min.js"></script>
sed: -e expression #1, char 16: unknown option to `s'

有关如何解决此问题的任何建议?虽然以上不是一个好习惯,但它会及时帮助我。

预期结果:

http://cuevana0.tv/,0

2 个答案:

答案 0 :(得分:3)

我认为在bash中使用cat使用工具(grep,返回代码)正确使用<{p}}的正确方法是正确的编码方式

#!/usr/local/env bash

while IFS= read -r url; do
    if curl -i -H "Accept: application/json" "$url" 2>&1 | grep -q "coin"; then
        printf "%s,0\n" "$url" 
    else
        printf "%s,1\n" "$url" 
    fi
done < urlFile

以上代码使用正确的方法

  1. 使用输入文件重定向并使用while循环和read命令循环浏览文件(避免在有空格时分隔行)
  2. 通过禁止搜索输出grep到控制台
  3. ,直接在if子句中使用-q的返回码
  4. stdout的{​​{1}}和stderr传递给curl以查找关键字。
  5. 双重引用变量,以便在存在空格时由于Word拆分而不允许它们拆分。
  6. 正如伟大的glenn-jackman指出的那样,你可以将整个if-else子句替换为

    grep

    意味着在管道之后立即打印curl -i -H "Accept: application/json" "$url" 2>&1 | grep -q "coin"; printf "%s,%d\n" "$url" $? 的错误代码。

答案 1 :(得分:2)

当前的问题是你正在使用&#34; /&#34;字符作为sed表达式中的分隔符,但是您替换的字符串也包含&#34; /&#34;,因此sed错误表示分隔符并且非常混淆。例如,在网址&#34; http://cuevana0.tv/&#34;上,您正在运行命令:

sed "s/^\(.\)/http://cuevana0.tv/,\1/"

...由于额外的&#34; /&#34;这是无效的sed语法字符。您可以切换为使用其他分隔符,例如... | sed "s@^\(.\)@$i,\1@"; ...(如果您确定&#34; @&#34;将永远不会出现在您的某个网址中)。

但是,有一个更好的方法来做到这一点。而不是echo状态然后使用编辑添加网址,只需使用echo "$i,$?"

这里的另一件事是一个坏主意:for i in $(cat small)会受到许多潜在问题的影响,具体取决于文件可能包含的空格和/或通配符。通常,while read -r i; do ... done <small更容易预测。除非循环内的任何内容从stdin读取(或可能从stdin读取),否则应使用while read -r i <&3; do ... done 3<small代替。