Ось такий 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
робить), і буде відповідати 1 - й 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-го.