sed在两个特定字符之间打印文本

时间:2013-03-15 11:03:01

标签: search sed character

我有一些播放列表文件的行,并且只想提取文件名并打印出每行:

<location>file:///mnt/c3/jtvtes/ww/adw.avi</location>
<location>file:///mnt/c2/clown.mp4</location>
<location>file:///mnt/c2/jtv/video/ww/god.mp3</location>

从这些方面我只需要:

adw.avi
clown.mp4
god.mp3

所以我尝试在“/”和“&lt;”之间提取文本字符:

sed -r 's/^(.*)pat1(.*)pat2(.*)$/\2/g'

修改为:

sed -r 's/^(.*)/(.*)<(.*)$/\2/g'

但这不起作用,有人有想法/解决方案吗?

3 个答案:

答案 0 :(得分:2)

一种方式:

sed -r 's|.*/(.*)</.*|\1|' file

答案 1 :(得分:2)

当我想提取时,grep首先出现。

试试这一行:

grep -Po "(?<=/)[^/]*(?=<)" file

答案 2 :(得分:0)

当它是XML时,首先执行该操作,以避免错误:

lxprintf -e location "%s\n" . yourfilename | awk -F '{print $NF}'

这可以保证您逐行获取文本内容。 lxprintf是http://www.ltg.ed.ac.uk/software/ltxml2的LTxml2工具包的一部分。然后awk为您提供最后一个斜杠分隔的标记。

如果您需要将其嵌入到生产工作流程中,常规实用程序不太容易访问或接受,请使用XSLT2:

<xsl:template match="location">
  <xsl:value-of select="tokenize(.,'/')[position()=last()]"/>
  <xsl:text>&#xa;</xsl:text>
</xsl:template>