awk中的反向引用

时间:2013-10-17 14:46:51

标签: regex awk

我有一个文本文件,其中包含

![](screeshot-3.jpg)
The above screenshot shows how you can delete posts by tags.

![](screeshot-4.jpg)
The above screenshot shows how you can delete posts by custom taxonomies.

我想用这些行替换(注意从前一行的文件名中检索行号)

3. The above screenshot shows how you can delete posts by tags.

4. The above screenshot shows how you can delete posts by custom taxonomies.

不应编辑其他行。

我可以写一个正则表达式来匹配数字,但我不知道如何在替换时再次引用这个数字。

请告诉我如何在awk中执行此操作。

更新:请注意,我不能使用GNU版本,它需要在Mac和Ubuntu中都能正常工作。

3 个答案:

答案 0 :(得分:3)

使用GNU awk扩展到match()

gawk '
    match($0, /^!\[\].*-([0-9]+)\.jpg/, m) {
        printf "%d. ", m[1]
        next
    }
    1
' file.txt

答案 1 :(得分:1)

一种方法是使用字符.-拆分上一行,并提取第二个位置,保存在变量中并将其用于非空白的每一行:

awk '
    $0 ~ /^!\[\]/ { 
        split($0, arr, /[-.]/)
        num = arr[2]
        next 
    } 
    num {
        print num ". " $0
        num = 0
        next
    } 
    { print }
' infile

它产生:

3. The above screenshot shows how you can delete posts by tags.

4. The above screenshot shows how you can delete posts by custom taxonomies.

编辑:抱歉。我没有读到你不能使用GNU版本。我评论了\S不支持的模式[^[:blank:]]。我希望它现在有效。

答案 2 :(得分:1)

如果您对perl很好,那么您可以使用以下版本:

perl -lne 'if(/^\!.*-([\d]+)\.jpg/)
           {$a=$1}
           elsif(/^[a-zA-Z]/)
           {print "$a \. $_"}' your_file