Amelio Vazquez-Reina
Amelio Vazquez-Reina

Reputation: 96378

Perl one-liner to extract groups of characters

I am trying to extract a group of characters with a Perl one-liner, but I have been unsuccessful:

echo "hello_95_.txt" | perl -ne 's/.*([0-9]+).*/\1/'

Returns nothing, while I would like it to return 95. How can I do this with Perl?

Update:

Note that, in contrast to the suggested duplicate, I am interested in how to do this from the command-line. Surely this looks like a subtle difference, but it's not straightforward unless you already know how to effectively use Perl one-liners.

Since people are asking, eventually I want to learn to use Perl to write powerful one-liners, but most immediately I need a one-liner to extract consecutive digits from each line in a large text file.

Upvotes: 15

Views: 13634

Answers (2)

Hynek -Pichi- Vychodil
Hynek -Pichi- Vychodil

Reputation: 26131

perl -pe's/\D*(\d+).*/$1/'

or

perl -nE'/\d+/&&say$&'

or

perl -nE'say/(\d+)/'

or

perl -ple's/\D//g'

or may be

perl -nE'$,=" ";say/\d+/g'

Upvotes: 18

Rob Raisch
Rob Raisch

Reputation: 17367

Well first, you need to use the -p rather than the -n switch.

And you need to amend your regular expression, as in:

echo "hello_95_.txt" | perl -pe "s/^.*?([0-9]+).*$/\1/"

which looks for the longest non-greedy string of chars, followed by one or more digits, followed by any number of chars to the end of the line.

Note that while '\1' is acceptable as a back-reference and is more familiar to SED/AWK users, '$1' is the more up-to-date form. So, you might wish to use:

echo "hello_95_.txt" | perl -pe "s/^.*?([0-9]+).*$/$1/"

instead.

Upvotes: 0

Related Questions