2012-11-14 31 views
19

Tôi đang cố gắng tăng biến trong tệp .xml. Thẻ có thể nằm trong tệp 100 lần hoặc chỉ hai lần. Tôi đang cố gắng thêm một giá trị sẽ tăng số tiền nhiều lần. Tôi đã bao gồm một số mẫu mã tôi đang làm việc trên, nhưng khi tôi chạy kịch bản nó sẽ chỉ đặt một và không tăng thêm. Lời khuyên sẽ là tuyệt vời về những gì tôi đang làm sai.Tăng thêm bash

for xmlfile in $(find $DIRECTORY -type f -name \*.xml); do 
    TFILE="/tmp/$directoryname.$$" 
    FROM='><process>' 
    TO=' value\=""><process>' 
    i=0 
    while [ $i -lt 10 ]; do 
    i=`expr $i + 1` 
    FROM='value\=""' 
    TO='value\="'$i'"' 
    done 
    sed "s/$FROM/$TO/g" "$xmlfile" > $TFILE && mv $TFILE "$xmlfile" 
done 

Các while vòng lặp là một cái gì đó tôi chỉ đặt để kiểm tra mã. Nó sẽ chèn <process> nhưng nó sẽ không chèn gia số.

cuối Mục tiêu của tôi:

<process>value="1"</process> 
<process>value="2"</process> 
<process>value="3"</process> 
<process>value="4"</process> 

Và như vậy càng lâu càng <process> hiện diện trong các tập tin cần thiết để tăng.

Trả lời

19

Đối với một số gia thích hợp trong bash, sử dụng một vòng lặp for (C phong cách):

n=10 
for ((i=1; i<=n; i++)) { 
    printf '<process>value="%d"</process>\n' $i 
} 

OUTPUT

<process>value="1"</process> 
<process>value="2"</process> 
<process>value="3"</process> 
<process>value="4"</process> 
<process>value="5"</process> 
<process>value="6"</process> 
<process>value="7"</process> 
<process>value="8"</process> 
<process>value="9"</process> 
<process>value="10"</process> 

NOTE

expr là một chương trình được sử dụng trong mã shell cổ xưa để làm toán. Trong vỏ Posix như bash, sử dụng $ ((biểu thức)). Trong bash và ksh93, bạn cũng có thể sử dụng ((expression)) hoặc let expression nếu bạn không cần sử dụng kết quả trong phần mở rộng.

EDIT

Nếu tôi hiểu lầm nhu cầu của bạn và bạn có một tập tin với giá trị trống như thế này:

<process>value=""</process> 

thử điều này:

$ perl -i -pe '$c++; s/<process>value=""/<process>value"$c"/g' file.xml 
<process>value"1"</process> 
<process>value"2"</process> 
<process>value"3"</process> 
<process>value"4"</process> 
<process>value"5"</process> 
<process>value"6"</process> 
<process>value"7"</process> 

-i công tắc chỉnh sửa các tập tin cho thật, hãy cẩn thận.

+0

Xem thử nghiệm: http://pastie.org/5395937 –

32

Tôi vừa kiểm tra mã của bạn và có vẻ như tăng một cách chính xác i.

Bạn có thể thử thay đổi cú pháp increment của bạn từ:

i=`expr $i + 1` 

Để

i=$((i+1)) 
+13

hoặc chỉ '((i ++))'. Chúc mọi người may mắn. – shellter

+1

không hoạt động. Bây giờ nó in thành tệp .xml giá trị = "10" cho mọi thứ và không tăng –

+0

@CuriousGeorge: nếu bạn luôn nhận được 10, thì: A. ở đâu nó được đặt thành giá trị đó (HOẶC bằng cách nào đó là giá trị từ 0-9 đang bị loại bỏ hoặc bỏ qua), B. làm thế nào nó có thể in ngay cả khi bạn có một điều kiện 'i -lt 10'," i lessThan 10 "(Có lẽ bạn nên thử' ((i ++ <10)) 'Tìm hiểu cách bật tính năng gỡ lỗi/theo dõi vỏ bằng' set -vx' ở gần đầu và 'set + vx' để tắt dấu vết. Điều này sẽ cho bạn thấy dòng (hoặc khối) mã sẽ được thực hiện, và sau đó mỗi bước thực hiện với các giá trị được thay thế cho các biến: – shellter

1

Sử dụng awk:

awk '{gsub("value=\"\"", "value=" i++); print }' i=1 input-file 

này sẽ thay thế các chuỗi value="" với value="1", value="2", vv . Bạn có thể dễ dàng thay đổi giá trị bắt đầu và thặng dư (ví dụ ..."value=" i); i+=5; print)

9

Đây là cách đơn giản nhất để tăng một biến trong bash:

i=0 
((i++)) 
Các vấn đề liên quan