2012-04-29 3 views
12

Tôi có lệnh này:AWK - chức năng phụ và gsub?

$ find $PWD -name "*.jpg" | awk '{system("echo " $(sub(/\//, "_"))) }' 
_home/mol/Pulpit/test/1.jpg 

Bây giờ điều tương tự, nhưng sử dụng gsub:

$ find $PWD -name "*.jpg" | awk '{system("echo " $(gsub(/\//, "_"))) }' 

[email protected]:~ 

Tôi muốn nhận được kết quả:

_home_mol_Pulpit_test_1.jpg 

Cảm ơn bạn đã giúp đỡ của bạn.

EDIT:

tôi đặt 'echo' để kiểm tra lệnh:

$ find $PWD -name "*.jpg" | awk '{gsub("/", "_")} {system("echo " mv $0 " " $0) }' 
_home_mol_Pulpit_test_1.jpg _home_pic_Pulpit_test_1.jpg 

[email protected]:~ 

Tôi muốn nhận được kết quả:

$ find $PWD -name "*.jpg" | awk '{gsub("/", "_")} {system("echo " mv $0 " " $0) }' 
/home/pic/Pulpit/test/1.jpg _home_pic_Pulpit_test_1.jpg 

[email protected]:~ 

Cảm ơn bạn đã giúp đỡ của bạn.

+2

hãy xem 'cái lệnh rename'. Có hai phiên bản. Một là một kịch bản Perl đôi khi được gọi là ['prename'] (http://man.he.net/man1/prename). Một phần khác là một phần của gói ['util-linux-ng'] (https://launchpad.net/util-linux-ng). Hoặc có thể làm loại đổi tên bạn đang làm. –

+0

Cảm ơn các liên kết. – Tedee12345

Trả lời

18

Điều đó sẽ không hoạt động nếu chuỗi chứa nhiều hơn một trận đấu ... thử này:

echo "/x/y/z/x" | awk '{ gsub("/", "_") ; system("echo " $0) }' 

hoặc tốt hơn (nếu echo không phải là một giữ chỗ cho cái gì khác):

echo "/x/y/z/x" | awk '{ gsub("/", "_") ; print $0 }' 

trong trường hợp của bạn, bạn muốn tạo một bản sao của giá trị trước khi thay đổi nó:

echo "/x/y/z/x" | awk '{ c=$0; gsub("/", "_", c) ; system("echo " $0 " " c)}'