RegEx/SED?用单个目录名替换XML文件中的分层路径

RegEx/SED?用单个目录名替换XML文件中的分层路径,xml,regex,file,sed,itunes,Xml,Regex,File,Sed,Itunes,我希望有人能在这方面帮助我-我怀疑答案可能是RegEx或Sed命令,但我不知道如何做到这一点 背景:我想清除我的iTunes音乐收藏,因此我创建了一个iTunes播放列表,并将我想要保留的相应mp3/AAC复制到USB驱动器中。与播放列表XML文件中的一首歌曲相关的片段如下所示: <key>Persistent ID</key><string>B123AA625019E726</string> <key>Track Type</k

我希望有人能在这方面帮助我-我怀疑答案可能是RegEx或Sed命令,但我不知道如何做到这一点

背景:我想清除我的iTunes音乐收藏,因此我创建了一个iTunes播放列表,并将我想要保留的相应mp3/AAC复制到USB驱动器中。与播放列表XML文件中的一首歌曲相关的片段如下所示:

<key>Persistent ID</key><string>B123AA625019E726</string>
<key>Track Type</key><string>File</string>
<key>Purchased</key><true/>
<key>Location</key><string>file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music/Adele/21/01%20Rolling%20In%20The%20Deep.m4a</string>
<key>File Folder Count</key><integer>5</integer>
<key>Library Folder Count</key><integer>1</integer>
然后,在删除整个库之后,我安装了Mavericks Mac,并打算将导出的内容重新导入。问题在于,音乐文件复制到单个文件夹,播放列表引用原始层次位置。我想将播放列表中每首歌曲的“Location”值更改为新的单一目录,以便我可以重新导入播放列表并保留每首歌曲的元数据。我发现/替换将不起作用,因为原始位置为2/3/4等深度。如果有帮助,我可以使用Mac或Linux提示符。有人能帮我吗

如果你能帮忙的话,请提前多谢


Ben

以下示例使用sed替换字符串file://localhost/Users/bc 具有file:///home/bc

实例 data.xml
我假定您的音乐文件都在的子文件夹下file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music/Adele/ 你想把它们改成直接在下面file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music/Adele/

sed '/<key>Location<\/key</s!file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music
/Adele/.*/\([^/]\+\)</string>!file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music
/Adele/\1</string>!' data.xml

/location你是说现在所有歌曲都在一个文件夹中,因此需要替换位置中最后一首/之前的任何内容吗?问题中的示例不是有效的XML:LocationHi Harald,是的,这是完全正确的-所有的音乐文件现在都在一个文件夹中:上面的XML文件中显示的原始文件夹位置是'n'级深-一些是艺术家的,相册-其他由编译等。我希望用一个到我现在剩下的单个文件夹的路径替换这些“n”级别,以便我可以将此播放列表(包括元数据)导入。嗨,路易斯,你说得对-它不是有效的XML!这不是打字错误,而是iTunes存储数据的方式!你应该更准确地解释什么是输入,什么是期望的输出。举个例子。嗨,马克,每个字符串的file://localhost/Users/bc'与音乐文件相关的将音乐文件置于任意数量的子目录下。我想用一个目录替换任意数量的目录-我想你需要一个正则表达式-你能确认吗-你知道它会是什么吗?!?谢谢嗨,卡米查尔邦!你的假设完全正确。我尝试了你的sed命令,但它没有改变文件中的任何内容。下面是位置节点的另一个示例:Locationfile://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music/Kavinsky/Nightcall%20-%20Single/01%20Nightcall.M4A来自@QAMichaelPeng的回复编辑无效:我的脚本刚刚将新内容输出到控制台,您可以将其重定向到一个新的xml文件,如sed/Location data_new.xml,非常感谢Francisco和QAMichaelPeng。我尝试了您的建议,输出的文件与输入文件相同。这里是位置节点的另一个示例(如果有帮助的话):Locationfile://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music/Syd%20Matters/Brotherocean/02%20Hi%20Life.m4a 顺便说一下,在上面的示例中,我希望所有音乐文件都显示在music文件夹下,而不是music/Adele/下,因此我假设我只是删除了Adele。再次感谢-新年快乐!
<song>
  <key>Persistent ID</key>
  <string>B123AA625019E726</string>
  <key>Track Type</key>
  <string>File</string>
  <key>Purchased</key>
  <true/>
  <key>Location</key>
  <string>file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music/Adele/21/01%20Rolling%20In%20The%20Deep.m4a</string>
  <key>File Folder Count</key>
  <integer>5</integer>
  <key>Library Folder Count</key>
  <integer>1</integer>
</song>
sed '/<key>Location<\/key</s!file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music
/Adele/.*/\([^/]\+\)</string>!file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music
/Adele/\1</string>!' data.xml
sed '/<key>Location<\/key</s!file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music
/Adele/.*/\([^/]\+\)</string>!file://localhost/Users/bc/Music/iTunes/iTunes%20Media/Music
/Adele/\1</string>!' data.xml > data_new.xml