Đây là một sed
cách tiếp cận:
$ sed -nE '1s/.{11}(.{8}).*/\1/p; 3s/.{3}(.{4}).*/\1/p' file
Ethernet
t6 a
Giải trình
Việc -n
chặn đầu ra bình thường (thông thường là in mọi dòng đầu vào) để nó chỉ in khi được yêu cầu. Cho -E
phép mở rộng các biểu thức thông thường.
Các sed
kịch bản có hai lệnh, cả hai đều sử dụng toán tử thay thế ( s/original/replacement/
). Di 1s/.{11}(.{8}).*/\1/p
chúc chỉ chạy trên dòng thứ nhất (đó là những gì 1s
nó làm) và sẽ khớp với 11 ký tự đầu tiên của dòng ( .{11}
), sau đó nó bắt 8 số tiếp theo ( (.{8})
, dấu ngoặc đơn là một "nhóm bắt giữ") và sau đó mọi thứ khác cho đến khi cuối dòng ( .*
). Tất cả điều này được thay thế bằng bất cứ thứ gì trong nhóm bắt giữ ( \1
; nếu có nhóm bắt giữ thứ hai, nó sẽ là \2
v.v.). Cuối cùng, p
ở cuối ( s/foo/bar/p
) làm cho dòng được in sau khi thay thế đã được thực hiện. Điều này dẫn đến chỉ có 8 ký tự được xuất ra.
Lệnh thứ hai là cùng một ý tưởng chung ngoại trừ việc nó sẽ chỉ chạy trên dòng thứ 3 ( 3s
) và sẽ giữ 4 ký tự bắt đầu từ dòng thứ 4.
Bạn cũng có thể làm điều tương tự với perl
:
$ perl -ne 'if($.==1){s/.{11}(.{8}).*/\1/}
elsif($.==3){s/.{3}(.{4}).*/\1/}
else{next}; print; ' file
Ethernet
t6 a
Giải trình
Có -ne
nghĩa là "đọc dòng tệp đầu vào theo dòng và áp dụng tập lệnh được cung cấp -e
cho từng dòng. Tập lệnh là ý tưởng cơ bản giống như trước. $.
Biến giữ số dòng hiện tại để chúng tôi kiểm tra xem số dòng có phải 1
hay không 3
, và vì vậy, chạy thay thế, bỏ qua khác. Do đó, print
sẽ chỉ được chạy cho hai dòng đó vì tất cả các dòng khác sẽ bị bỏ qua.
Tất nhiên, đây là Perl, vì vậy TIMTOWTDI :
$ perl -F"" -lane '$. == 1 && print @F[11..19]; $.==3 && print @F[3..6]' file
Ethernet
t6 a
Giải trình
Ở đây, -a
phương tiện "phân tách từng dòng đầu vào trên ký tự được cung cấp bởi -F
và lưu thành mảng @F
. Vì ký tự được cung cấp trống, điều này sẽ lưu từng ký tự của dòng đầu vào dưới dạng một phần tử @F
. Sau đó, chúng tôi in các phần tử 11-19 ( mảng bắt đầu đếm tại 0
) cho dòng thứ 1 và thứ 3 cho dòng thứ 3.