Bash命令匹配n行

时间:2013-11-23 02:36:16

标签: regex bash sed awk grep

我有一个带文件/目录列表的索引HTML文件。它只是一个通常的文件浏览器,如:

...content here...    
<td><a href="20130011/">20120011/</a></td>
<td><a href="20130111/">20120111/</a></td>
<td><a href="20130211/">20120211/</a></td>
<td><a href="20130411/">20120411/</a></td>
...content here...

我不明白如何从底部提取第二行。

1)我用curl

下载了HTML
content=$(curl -sL "http://path-to-html")

2)然后使用

dir=$(echo $content | sed '/.*href="\([0-9]*\/\)".*/!d;s//\1/;q')

给了我最后一场比赛:20120411

但如何获得前一个?

我不知道物品的总数。

3 个答案:

答案 0 :(得分:3)

程序将打印倒数第二行:

echo ${content} | awk '{ pen = ult; ult = $0 } END { print pen }'

这将打印倒数第二个匹配行

echo ${content} | awk '/href="([0-9]{8}\/)"/ { pen = ult; ult = $0 } END { print pen }'

如果您只想提取第一个捕获组:

echo ${content} | awk 'match($0, /href="([0-9]{8}\/)"/, a) { pen = ult; ult = a[1] } END { print pen }'

全部放在一起:

bash-4.2$ dir=$(curl -sL http://www.arteetmarte.no/tmp/index.html |
    awk 'match($0, /href="([0-9]{8}\/)"/, a) {
        pen = ult
        ult = a[1] 
    }
    END { 
        print pen 
    }
    ')
bash-4.2$ echo ${dir}
20130918/

经过测试:GNU Awk 4.1.0, API: 1.0

答案 1 :(得分:0)

使用

可能会更容易一些
dir=$(echo "$content"|awk '/href=/{x=p;p=$0}END{sub(/.*">/,"",x);sub(/<.*/, "",x); print x}') 

答案 2 :(得分:0)

dir=$(echo $content | sed sed -n '/href="\([0-9]\{1,\}\/\)"/ {s|.*href="\([0-9]\{1,\}/\)".*|-\1-|;H;}
$ {x;l;s|.*-\([0-9]\{1,\}/\)-\(\n-[0-9]\{1,\}/-\)\{1\}$|\1|p;}')

\{1\}$中的1指定必须从末尾删除多少行