Xml 使用url提供sed替换帮助

Xml 使用url提供sed替换帮助,xml,sed,plex,Xml,Sed,Plex,我需要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/.*u

我需要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>
IPADDRESS=$(
curl-b plexcookie.txt“https://plex.tv/pms/resources.xml?includeHttps=1&X-丛令牌=${PLX_-TOK}”|\
sed的/*uri=\“\([^\“]*\)\”\slocal.*/\1/g'|\
尾部(n 5)
这只返回最后5行,但我只需要
https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400

非常感谢您提供的任何帮助。我知道xml解析器可能更适合于此,但我正在嵌入式设备上开发它,无法承担额外的开销

正如oguzismail所写,最好使用xml解析器,但即使使用简单的工具,您也可以解决此问题:

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

grep 'local="1"' file.xml
这将产生:

这将产生:

3.uri是一致的,您可以选择其中一个(例如最后一个)

这个产品

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

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

然后你就可以得到你想要的了!

使用一个合适的XML解析器,sed不适合它。请为你的问题中的示例输入添加你想要的输出。添加了想要的输出,谢谢!
IPADDRESS=$(curl-b plexcookie.txt)https://plex.tv/pms/resources.xml?includeHttps=1&X-丛令牌=${PLX_-TOK}“|grep'local=“1”'| sed's/*uri=\”\([^\“]*\)\“\slocal.*/\1/g'| tail-n 1)
我们快到了,我更新了原始查询以更清楚地说明问题
sed "s/.*uri=\"\([^\"]*\)\"\slocal.*/\1/g"
https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400
https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400
tail -1
https://192-168-1-123.385ualfkj3fakedlajkf353029485234.plex.direct:32400
grep 'local="1"' file.xml | sed "s/.*uri=\"\([^\"]*\)\"\slocal.*/\1/g" | tail -1