4

我有这种格式的输出:

/ignore-this/^/../I/want/this@ignore-this

我正在尝试使用 awk 正则表达式来捕获以下内容:

../I/want/this

这不会特别难,只是我无法弄清楚如何正确转义,^所以它不会被解释为新行或不是。以下是我到目前为止的内容,它几乎可以工作,除了打印出来:

/ignore-this/^/../I/want/this

这是代码:

#!/bin/awk -f                                                                              
{
    if (match($0, "\^.*@")){
        print substr($0, RSTART, RLENGTH-1);
    }
}
4

3 回答 3

2
> echo '/ignore-this/^/../I/want/this@ignore-this' |\ 
awk -F"^" '{split($NF,a,"@");print a[1]}' 

输出:

/../I/want/this

这会在所有“^”上拆分输入流。然后它获取最后一个字段并将其拆分为“@”并打印字符串的前半部分。

编辑:或使用:

awk '/\^/{split($0,a,"[@^]");print a[2]}' file

HTH 克里斯

于 2011-11-07T19:20:33.910 回答
2

另一种可能性,使用 gawk:

#!/opt/local/bin/gawk -f
{
    if (match($0, /[\^]\/(.*)@/, pieces)) {
        print pieces[1];
    }
}
于 2011-11-07T19:39:29.830 回答
0
awk -F'\\^|@' '{print $2}'

应该在这种情况下工作

kent$  echo "/ignore-this/^/../I/want/this@ignore-this"\
        |awk -F'\\^|@' '{print $2}' 
/../I/want/this
于 2011-11-07T20:43:19.857 回答