Извлечь число, которое присваивается строке с использованием скрипта Perl

У меня есть файл input.txt, который имеет некоторые строки, и каждая строка имеет некоторые значения, назначенные ему.

Моя задача - написать скрипт Perl для извлечения числа, которое назначено любому из Строки.

Например, учитывая это input.txt

Tom=0×1234,Bob=0x4567,rock=0x8912.

Мне нужно извлечь значение, присвоенное rock.

Мне нужно некоторые помогают писать сценарий для этого.

4
задан 20 December 2017 в 20:29

6 ответов

Что-то вроде этого

echo Tom=0×1234,Bob=0x4567,rock=0x8912 | perl -E'while(<<>>){print map$_->[1],grep$_->[0]=~/rock/,[split/=/]for split/,/,$_}';

Это компилируется с warnings и использует новый <<>>, поэтому это действительно хороший Perl-код.

-3
ответ дан 18 July 2018 в 01:00

Один вариант на @terdon - для каждого /rock=(...)/, скажем:

perl -nE 'say for /rock=(\w+)/'

и решение с grep

grep -Po 'rock=\K\w+' file
5
ответ дан 18 July 2018 в 01:00

Вот один из способов:

$ perl -lne '/rock=([^.,]+)/ && print $1' file 0x8912

/rock=([^.]+)/ будет соответствовать строке rock=, а затем зафиксировать самый длинный участок одного или нескольких символов не . ([^.]+). Скобки «захватывают» совпадение и делают его доступным как $1. Если это соответствует, печатается $1.

-l удаляет завершающие символы новой строки из каждой строки ввода и добавляет новую строку для каждого вызова print. [F10] сообщает perl читать входной файл по строкам и применять скрипт, заданный -e для каждой строки.

4
ответ дан 18 July 2018 в 01:00

Что-то вроде этого

echo Tom=0×1234,Bob=0x4567,rock=0x8912 | perl -E'while(<<>>){print map$_->[1],grep$_->[0]=~/rock/,[split/=/]for split/,/,$_}';

Это компилируется с warnings и использует новый <<>>, поэтому это действительно хороший Perl-код.

-3
ответ дан 24 July 2018 в 17:19
  • 1
    Это также будет печатать значения, связанные с foorock, rockfoo, forrockbar и т. Д. Он также будет печатать все вместе, если есть еще один экземпляр rock. Если вы действительно хотите использовать этот бесполезно запутанный и трудно читаемый подход, вы должны по крайней мере пойти на perl -E'while(<<>>){print map$_->[1],grep$_->[0] eq "rock",[split/=/]for split/,/,$_,"\n"}';. – terdon♦ 20 December 2017 в 20:51

Один вариант на @terdon - для каждого /rock=(...)/, скажем:

perl -nE 'say for /rock=(\w+)/'

и решение с grep

grep -Po 'rock=\K\w+' file
5
ответ дан 24 July 2018 в 17:19

Вот один из способов:

$ perl -lne '/rock=([^.,]+)/ && print $1' file 0x8912

/rock=([^.]+)/ будет соответствовать строке rock=, а затем зафиксировать самый длинный участок одного или нескольких символов не . ([^.]+). Скобки «захватывают» совпадение и делают его доступным как $1. Если это соответствует, печатается $1.

-l удаляет завершающие символы новой строки из каждой строки ввода и добавляет новую строку для каждого вызова print. [F10] сообщает perl читать входной файл по строкам и применять скрипт, заданный -e для каждой строки.

4
ответ дан 24 July 2018 в 17:19
  • 1
    @PerlDuck нет, я давал конкретное решение. Я отредактировал так, что он работает с запятыми, а также с полными остановками, хотя, спасибо. – terdon♦ 20 December 2017 в 23:34
  • 2
    @PerlDuck разборчиво это прекрасно! Я склонен идти на самое общее решение, о котором я могу думать, но так как ОП здесь, похоже, просит нас сделать домашнее задание, мне не хотелось делать это слишком легко. И никогда не приношу извинения за исправления, или, конечно же, не для меня так или иначе :) – terdon♦ 20 December 2017 в 23:39

Другие вопросы по тегам:

Похожие вопросы: