Печать всех числовых данных по одному

Классический способ сделать это в sed (без чтения всего файла )будет:

sed -e :a -e '$!N;s/\nand/ and/;ta' -e 'P;D' file

Пр.

$ sed -e :a -e '$!N;s/\nand/ and/;ta' -e 'P;D' file
tomato
ham and eggs
BLT
peanut butter and jelly sandwich

См., например, Sed One -Объяснение вкладышей, часть I :Интервал между файлами, нумерация, преобразование и замена текста , 40. Добавить строку к предыдущей, если она начинается с знак равенства "="

0
13.04.2021, 20:05
3 ответа

Использование стандартных trиgrep:

tr -s ',;. ' '[\n*]' <file | grep -x '[[:digit:]]*'

Это сначала изменяет все возможные символы-разделители на символы новой строки (и "сжимает" несколько последовательных символов новой строки в одну ). Этот первый шаг производит вывод

this
is
txt
*24354
filer3243gdt
4332
123
sfdg
gtdf
gtdf
tr
3435
gfdsf
43er
43
3543
4354w
t535
tfgq
3542
fgdg
243
wre
24342
24354
13
tgd
dsgf
3256653756456744rfdgf@gmail
com

Отсюда grepиспользуется для извлечения строк, содержащих только цифры. Параметр -xдля grepприводит к полному совпадению строк, а используемый шаблон соответствует любому количеству цифр.

Шаг grepприводит к

4332
123
3435
43
3543
3542
243
24342
24354
13

Это идентично ожидаемому результату.

Моя первая попытка выглядела так

tr -s '[:punct:][:blank:]' '[\n*]' | grep -x '[[:digit:]]*'

, который использует любую пунктуацию или пробел в качестве разделителя. Это также позволило получить первый 24354(, которому на входе предшествует*). Это может быть неправильно, но код выглядит красивее:-)

Класс символов [:punct:]содержит набор

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

и [:blank:]— пробел и табуляция.

3
28.04.2021, 22:52

PCRE посмотрите -здесь нужны обходы:

grep -oP '(?<=^|\s|;)\d+(?=$|\s|;)' file

Отсутствующие допустимые разделители могут быть добавлены в регулярное выражение, я думаю, в очевидных местах.

0
28.04.2021, 22:52
$ perl -F'[\s,;.]' -lane 'foreach (@F) {print $_ if m/^\d+$/}' inputfile
4332
123
3435
43
3543
3542
243
24342
24354
13

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

Затем для каждого поля сценарий проверяет, содержит ли поле только цифры, и печатает его, если содержит.

0
28.04.2021, 22:52

Теги

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