【问题标题】:extract text between single quotes in mult line variable with sed使用 sed 在多行变量中提取单引号之间的文本
【发布时间】:2017-11-18 12:49:12
【问题描述】:

我正在尝试编写脚本。我使用带有 xmlrpc 的远程过程调用来获取 url。例如,我将输出分配为一个变量,例如url=$(xmlrpc 192.168.1.1 command...)。这是输出到文件时过程调用的输出:

Result:

String: 'http://example.url'

这一切都与echo $url 一起显示在一行中。当我尝试使用 sed s/^.*'\(.*\)'.*$/\1/ $url 提取单引号之间的 URL 时,我得到以下信息:

sed: can't read Result:: no such file or directory
sed: can't read String:: no such file or directory
sed: can't read http://example.url: no such file or directory

也许多行是问题所在。我收到grep -oP "(?<=').*?(?=')" $url 的类似错误有什么想法吗?我只想提取网址。

【问题讨论】:

  • 为什么要“使用 sed”?例如,如果这是在 bash 中,您是否有理由不使用 shell 的本机正则表达式支持?
  • 那是因为 sed 和 grep 都将文件作为参数,而不是字符串。
  • 我使用 sed 没有特别的原因。我也试过 awk 和 grep。没想到尝试原生shell。什么都行。很高兴知道,它不接受字符串作为参数。谢谢。

标签: bash variables sed


【解决方案1】:

我认为您应该尝试使用原生 bash 正则表达式和替换。如果您真的想从多行变量中提取 URL:

$ echo "$url"
Results:

String: 'http://example.url'

使用 sed,那么你可以使用这样的东西:

$ url=$(sed -n "s/^.*'\(.*\)'.*$/\1/p" <<< $var)
$ echo "$url"
http://example.url

【讨论】:

    【解决方案2】:

    使用 bash 正则表达式

    [[ "$url" =~ \'(http:[^\']*)\' ]] && echo ${BASH_REMATCH[1]}
    http://example.url
    

    【讨论】:

    • 这也有效,但我必须删除 http: 部分才能使其工作。可能是因为 URL 并不总是以它开头。我的问题最初是关于 sed 的,所以我将把另一个回复作为答案(供后代使用),但会根据我的需要使用这个回复,因为它是比使用 sed 更好的方法来完成我想要完成的事情。我只是没有考虑过这种方法。谢谢。
    • @user2328273,您可以轻松调整到[[ "$url" =~ \'([^\']*)\' ]] &amp;&amp; echo ${BASH_REMATCH[1]}的方式
    • 是的,我就是这么做的。谢谢。
    【解决方案3】:
    sed -n "s/^.*'\(.*\)'.*$/\1/ p" <<< ${url}
    

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 1970-01-01
      • 2013-10-26
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2014-12-31
      相关资源
      最近更新 更多