【问题标题】:sed replacement assistance with url带有 url 的 sed 替换帮助
【发布时间】:2019-08-07 19:25:50
【问题描述】:

我需要在我的变量中通过 sed 解析以下 xml 数据并返回 https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400

我正在使用一个名为 PLX_IP 的变量:

IPADDRESS=$(
  curl -b plexcookie.txt "https://plex.tv/pms/resources.xml?includeHttps=1&X-Plex-Token=${PLX_TOK}" | \
  sed 's/.*uri=\"\([^\"]*\)\"\slocal.*/\1/g' | \
  tail -n 5)



<?xml version="1.0" encoding="UTF-8"?>
<MediaContainer size="6">
  <Device name="Test" product="Plex Media Server" productVersion="1.14.1.5490-33830be0b" platform="Android" platformVersion="8.0.0" device="SHIELD Android TV" clientIdentifier="adfafasdfasdfasdfsdf" createdAt="1548647140" lastSeenAt="23424324" provides="server" owned="1" accessToken="asdfasdfadfadsfadsfa" publicAddress="11.111.11.11" httpsRequired="1" synced="0" relay="1" publicAddressMatches="1" presence="1">
    <Connection protocol="https" address="192.168.1.123" port="32400" uri="https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400" local="1"/>
    <Connection protocol="https" address="11.111.11.11" port="11111" uri="https://11-111-11-11.385ualfkj3fakedlajkf353029485234.plex.direct:11111" local="0"/>
  </Device>
  <Device name="Firefox" product="Plex Web" productVersion="3.91.0" platform="Firefox" platformVersion="65.0" device="OSX" clientIdentifier="adfafasdfasdfasdfsdf" createdAt="asdf" lastSeenAt="" provides="client,player,pubsub-player" owned="1" publicAddress="11.111.11.11" publicAddressMatches="1" presence="1" accessToken="asdfasdfadfadsfadsfa">
    <Connection protocol="https" address="192.168.1.123" port="32400" uri="https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400" local="1"/>
    <Connection protocol="https" address="11.111.11.11" port="11111" uri="https://11-111-11-11.385ualfkj3fakedlajkf353029485234.plex.direct:11111" local="0"/>
  </Device>
</MediaContainer>

这只会返回最后 5 行,但我只需要 https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400

非常感谢任何帮助。我知道 xml 解析器可能更适合这个,但我正在嵌入式盒子上开发它,无法承受额外的开销

【问题讨论】:

  • 使用适当的 XML 解析器,sed 不适合它。
  • 请将该示例输入的所需输出添加到您的问题中。
  • 添加了所需的输出,谢谢!
  • IPADDRESS=$( curl -b plexcookie.txt "https://plex.tv/pms/resources.xml?includeHttps=1&amp;X-Plex-Token=${PLX_TOK}" | grep 'local="1"' | sed 's/.*uri=\"\([^\"]*\)\"\slocal.*/\1/g' | tail -n 1)

标签: xml sed plex


【解决方案1】:

正如 oguzismail 所写,最好使用 xmlparser 来完成,但即使使用简单的工具也可以解决这个问题:

1. grep xml 文件中所有有趣的行

grep 'local="1"' file.xml

这个产品:

   <Connection protocol="https" address="192.168.1.123" port="32400" uri="https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400" local="1"/>
   <Connection protocol="https" address="192.168.1.123" port="32400" uri="https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400" local="1"/>

2。从这行中提取 uri 的形式

sed "s/.*uri=\"\([^\"]*\)\"\slocal.*/\1/g"

这个产品:

https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400
https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400

3。 uri 是相同的,你可以取其中一个(例如最后一个)

tail -1

这个产品

https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400

4.将所有部分连接在一起

grep 'local="1"' file.xml | sed "s/.*uri=\"\([^\"]*\)\"\slocal.*/\1/g" | tail -1

你会得到你想要的!

【讨论】:

  • 我们已经接近了,我更新了原来的询问以更清楚
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 2017-03-19
  • 2011-10-30
  • 2020-03-02
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多