2013-03-15 21 views
15

Tôi biết awk có thể làm thay text/chuỗi với sub()gsub() như:Ai đó có thể giải thích cho tôi tại sao sub()/gsub() của awk hoạt động như thế này?

kent$ echo "fffff"|awk '{gsub("f", "b")}1' 
bbbbb 

hoặc

kent$ echo "fffff"|awk '{gsub(/f/, "b")}1' 
bbbbb 

Tuy nhiên hôm nay tôi đã phạm sai lầm typo, tôi đã viết những dòng như:

kent$ echo "fffff"|awk '{gsub('f', "b")}1' 

Nhưng awk không phàn nàn về điều đó nhưng được tạo ra như thường lệ, tất nhiên, đầu ra bất ngờ, nó đã cho tôi đôi khi để tìm ra lỗi. Sản lượng awk đã cho tôi là:

bfbfbfbfbfb 

một ví dụ khác:

kent$ echo "fafafafafXX"|awk '{gsub('fa', "B")}1' 
BfBaBfBaBfBaBfBaBfBXBXB 

ví dụ với sub() là lạ quá:

kent$ echo "thanks in advance"|awk '{sub('a', "B")}1' 
Bthanks in advance 

Có thể ai đó giải thích cho tôi như thế nào đã được thay thế lạ thực hiện?

kent$ awk --version 
GNU Awk 4.0.2 

EDIT

cảm ơn cho câu trả lời từ Joni. có lẽ ví dụ này giải thích nó tốt hơn, tôi chỉ cần thêm nó ở đây:

kent$ echo "thanks in advance"|awk '{f="k";sub('f', "B")}1' 
thanBs in advance 

kent$ echo "thanks in advance"|awk '{sub('th ank', "B")}1' 
awk: cmd. line:2: {sub(th 
awk: cmd. line:2:  ^unexpected newline or end of string 

Trả lời

19

Khi bạn viết

echo "fffff"|awk '{gsub('f', "b")}1' 

gì awk thấy là {gsub(f, "b")}1. Nó diễn giải f dưới dạng biến, với giá trị trống và thay thế mỗi chuỗi trống trống trong đầu vào bằng b.

Chuỗi rỗng được tìm thấy giữa mỗi ký tự và sau ký tự cuối cùng, do đó, awk chèn một b sau mỗi f.

Bạn có thể thay thế // hoặc "" cho tác dụng tương tự, mà không có một biến không sử dụng:

echo "fffff"|awk '{gsub(//, "b")}1'   # fbfbfbfbfb 
+0

+1, âm thanh hợp lý. – Kent

+0

Tôi nghĩ rằng đây có thể là một mẹo để được sử dụng, ngay cả khi nó là một chút nguy hiểm. :) – Kent

Các vấn đề liên quan