Классический способ сделать это в 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. Добавить строку к предыдущей, если она начинается с знак равенства "="
Использование стандартных 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:]
— пробел и табуляция.
PCRE посмотрите -здесь нужны обходы:
grep -oP '(?<=^|\s|;)\d+(?=$|\s|;)' file
Отсутствующие допустимые разделители могут быть добавлены в регулярное выражение, я думаю, в очевидных местах.
$ perl -F'[\s,;.]' -lane 'foreach (@F) {print $_ if m/^\d+$/}' inputfile
4332
123
3435
43
3543
3542
243
24342
24354
13
Каждая строка ввода разбивается на поля с использованием пробелов и символов, указанных вами в качестве разделителя полей.
Затем для каждого поля сценарий проверяет, содержит ли поле только цифры, и печатает его, если содержит.