Вот sed
подход:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
объяснение
-n
Подавляет нормальный выход (нормаль печатать каждую строку ввода) , так что он печатает только тогда , когда велено. -E
Позволяет расширенные регулярные выражения.
В sed
скрипте есть две команды, каждая из которых использует оператор подстановки ( s/original/replacement/
). Функция 1s/.{11}(.{8}).*/\1/p
будет работать только на 1-й строке (это то, что 1s
делает) и будет соответствовать первым 11 символам строки ( .{11}
), затем она захватывает следующие 8 ( (.{8})
скобки являются «группой захвата»), а затем все остальное до конец строки ( .*
). Все это заменяется тем, что было в группе захвата ( \1
если бы была вторая группа захвата, это было бы \2
и т. Д.). Наконец, p
в конце ( s/foo/bar/p
) вызывается печать строки после замены. В результате выводятся только целевые 8 символов.
Вторая команда - это та же общая идея, за исключением того, что она будет выполняться только в 3-й строке ( 3s
) и сохранит 4 символа, начиная с 4-й.
Вы также можете сделать то же самое с perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
объяснение
Это -ne
означает «читать входной файл построчно и применять сценарий, заданный -e
для каждой строки. Этот сценарий является той же базовой идеей, что и раньше. $.
Переменная содержит текущий номер строки, поэтому мы проверяем, является ли номер строки либо, 1
либо, 3
и если» Итак, запустите подстановку, иначе пропустите. Поэтому print
будет выполняться только для этих двух строк, так как все остальные будут пропущены.
Конечно, это Perl, поэтому TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
объяснение
Здесь -a
означает «разбить каждую входную строку на символ, заданный -F
и сохранить как массив @F
. Поскольку данный символ пустой, это сохранит каждый символ строки ввода как элемент в @F
. Затем мы печатаем элементы 11-19 ( массивы начинают считать с 0
) для 1-й строки и 3-7 для 3-й.