Захват каретки (^) с регулярным выражением awk - PullRequest
4 голосов
/ 07 ноября 2011

У меня есть вывод с этим форматом:

/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);
    }
}

Ответы [ 3 ]

2 голосов
/ 07 ноября 2011

Другая возможность, используя gawk:

#!/opt/local/bin/gawk -f
{
    if (match($0, /[\^]\/(.*)@/, pieces)) {
        print pieces[1];
    }
}
2 голосов
/ 07 ноября 2011
> echo '/ignore-this/^/../I/want/this@ignore-this' |\ 
awk -F"^" '{split($NF,a,"@");print a[1]}' 

выход:

/../I/want/this

Это разделяет входной поток на все "^". Затем он берет последнее поле и разбивает его на «@» и печатает первую половину строки.

EDIT: Или используйте:

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

HTH Крис

0 голосов
/ 08 ноября 2011
awk -F'\\^|@' '{print $2}'

должно работать в этом случае

kent$  echo "/ignore-this/^/../I/want/this@ignore-this"\
        |awk -F'\\^|@' '{print $2}' 
/../I/want/this
...