2012-12-09 76 views
2

我在试图在UNIX过滤HTML标签的sed

<option value="20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option> 

过滤以下字符串到一个问题: 20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg2012-12-09 13:00。 我可以找到我想要的子串的开始,但不是结束。

file=tmpfile 
read -r firstline<$file 
firstArg=$(echo $firstline | sed 's/^.*value="//' | sed 's/">*$//') 
echo $firstArg 
secondArg=$(echo $firstline | sed 's/^.*">//' | sed 's/h<*$//') 
echo $secondArg 

输出如下:

20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option> 
2012-12-09 13:00h</option> 

但我真正想要的是

20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg 
2012-12-09 13:00 

回答

2

轻微修正,你缺少在两个地方.(第2 sed的每条线路上*前):

file=tmpfile 
read -r firstline<$file 
firstArg=$(echo $firstline | sed 's/^.*value="//' | sed 's/">.*$//') 
echo $firstArg 
secondArg=$(echo $firstline | sed 's/^.*">//' | sed 's/h<.*$//') 
echo $secondArg 

输入:

<option value="20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option> 

输出:

20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg 
2012-12-09 13:00 

说明:

  • * 0次或多次匹配前面的字符,所以你以前匹配的零个或更多>的和<的。
  • .与任何字符匹配
  • 因此>.*匹配>后的零个或多个字符。

改进:

此外,两个sed线可以更好地写为:

firstArg=$(sed 's/^.*value="//;s/">.*$//' <<< "$firstline") 
secondArg=$(sed 's/^.*">//;s/h<.*$//' <<< "$firstline") 
  • 分隔多个一个SED呼叫
  • <<<符号内更换由;图案被称为herestring,你可以保存回声这里的管道用它来代替
  • 始终包裹变量用双引号
+0

就是这样。非常感谢你。 –

1

尝试这样做:

sed -r '[email protected]*([0-9]{8}/[^"]+).*>([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}[[:alnum:]]*)<.*@\1\n\[email protected]' 

实例

$ cat file.txt 
<option value="20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg">2012-12-09 13:00h</option> 
$ sed -r '[email protected]*([0-9]{8}/[^"]+).*>([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}[[:alnum:]]*)<.*@\1\n\[email protected]' file.txt 
20121209/YvegRascYTGxmWLUIrqW/por121209130030.jpg 
2012-12-09 13:00h 
+0

这也适用,但对于我的需要,我更喜欢下面的解决方案。谢谢 –

+0

感谢这里的方法是upvote; = –

+0

我会,如果我可以:) –