这让我发疯了。我试图使用sed和som正则表达式从某些html中提取路径。我的原始文本是一个文件,sample.txt,如下所示:
<tr><td valign="top"><img src="/icon/file.ico" alt="[FILE]"></td><td><a href="/namespace/media/cloud-sync.xml">cloud-sync.xml</a></td><td align="right">Sat, 29 Mar 2014 06:08:13 GMT</td><td align="right">8210</td></tr>
<tr><td valign="top"><img src="/icon/file.ico" alt="[FILE]"></td><td><a href="/namespace/media/levels-sync.xml">levels-sync.xml</a></td><td align="right">Sat, 29 Mar 2014 06:08:47 GMT</td><td align="right">2203</td></tr>
首先我尝试了:
cat sample.txt | sed -n ’s/(\/namespace\/media\/.*-sync.xml)/\1/p’
但是这给了我:`sed:-e表达式#1,char 40:无效的引用\ 1在`s&#39;命令的RHS`
然后我做了:
cat sample.txt | sed -n 's/\(\/namespace\/media\/.*-sync.xml\)/\1/p'
但这似乎只是将整个文件还给我。
我想要的结果是回来
/namespace/media/nab-sync.xml
/namespace/media/levels-sync.xml
那里有任何可以帮助我的sed忍者?
答案 0 :(得分:0)
此gnu awk
会在该行的任何位置找到正确的数据
它不是sed
,但对于此awk
可能更好,或更容易理解。
awk -v RS='href="' -F\" 'NR>1 {print $1}' file
/namespace/media/cloud-sync.xml
/namespace/media/levels-sync.xml
此awk
应适用于任何系统:
awk -F\" '{for(i=1;i<=NF;i++) if ($i~"href=") print $(i+1)}' file
/namespace/media/cloud-sync.xml
/namespace/media/levels-sync.xml
答案 1 :(得分:0)
根据您的特定输入,这是正确的sed
命令:
cat sample.txt | sed 's/.*\(\/namespace\/media\/.*-sync.xml\).*/\1/g'
在sed中,这些群组会在\(...\)
之间捕获,但您使用的是(...)
另外,我添加了.*
添加原始正则表达式的两端以丢弃所有其他文本。
答案 2 :(得分:0)
我建议使用gnu grep
grep -Po 'href="\K[^"]*' file
/namespace/media/cloud-sync.xml
/namespace/media/levels-sync.xml
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed 's/.*href="\([^"]*\)".*/\1/' file
查找href
并在下一对双引号之间提取字符串。
答案 4 :(得分:-1)
暂时会这样做:
cat sample.txt | awk -F'["]' '{print $8}'
我对sed不是很熟悉,所以我发布了一个awk响应。