Ось такий 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-го.