Извлечение групп захвата в порядке смещения - PullRequest
0 голосов
/ 08 декабря 2018

У меня возникли проблемы с выяснением того, как захватить два шаблона, которые идут в порядке смещения из текстового файла, и распечатать их в том же порядке.Например, у нас есть этот текстовый файл:

13234::ABC
ABDE:1234
123::DUF

Что если я хочу вывести его так:

13234 ABC
1234 ABDE
123 DUF

То есть я хочу сначала найти все цифры, а затем всесимволы независимо от того, в каком порядке они вводятся в текстовом файле, а затем выводят цифры, за которыми следуют символы.

Как мне поступить?Я могу только понять, как это сделать, если они всегда располагаются в одном и том же порядке в текстовом файле.

Ответы [ 5 ]

0 голосов
/ 10 декабря 2018

Использование Perl

$ cat lunark.txt
13234::ABC
ABDE:1234
123::DUF
$ perl -F"/:+/" -alne ' print $F[0]=~/\d+/ ? "$F[0] $F[1]" : "$F[1] $F[0]" ' lunark.txt
13234 ABC
1234 ABDE
123 DUF
$
0 голосов
/ 09 декабря 2018

Это может сработать для вас (GNU sed):

sed 'h;s/[^[:alpha:]]//g;x;s/[^[:digit:]]//g;G;s/\n/ /' file

Разделите задачу на две части: создайте копию текущей строки, удалите все, кроме буквенных символов из первой, удалите все, кромецифры от второй, добавьте первую ко второй и замените новую строку пробелом.

0 голосов
/ 08 декабря 2018

Если вас интересует решение awk

awk -F ":+" '($1+0==$1){print $1,$2; next}{print $2,$1}'

Идея состоит в том, чтобы проверить, является ли первый столбец числом, печатать ли он исходный порядок, в противном случае поменять его местами.

0 голосов
/ 08 декабря 2018

sed решение (учитывая, что может быть только одна числовая последовательность):

sed -r 's/([0-9]*):*([a-zA-Z]+):*([0-9]*)/\1\3 \2/' inputfile

Выход:

13234 ABC
1234 ABDE
123 DUF
0 голосов
/ 08 декабря 2018

Учитывая, что ваш Input_file будет таким же, как показанные примеры.В случае если вы в порядке с awk, попробуйте выполнить следующее.

awk '
match($0,/[0-9]+/){
  dig=substr($0,RSTART,RLENGTH)
}
match($0,/[a-zA-Z]+/){
  print dig, substr($0,RSTART,RLENGTH)
  dig=""
}
'  Input_file

Вывод будет следующим.

13234 ABC
1234 ABDE
123 DUF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...