2012-10-22 7 views
5

Tôi cần phải sửa đổi một tập tin qua tập lệnh.
Tôi cần phải làm như sau:
NẾU một chuỗi cụ thể KHÔNG tồn tại, sau đó nối thêm nó.Điều kiện thêm hoặc nối thêm vào một tập tin trong tập lệnh linux

Vì vậy, tôi đã tạo ra kịch bản sau đây:

#!/bin/bash 
if grep -q "SomeParameter A" "./theFile"; then 
echo exist 
else 
    echo doesNOTexist 
    echo "# Adding parameter" >> ./theFile  
    echo "SomeParameter A" >> ./theFile  
fi 

này hoạt động nhưng tôi cần phải thực hiện một số cải tiến.
Tôi nghĩ sẽ tốt hơn nếu tôi kiểm tra nếu "SomeParameter" tồn tại và sau đó xem nếu nó được theo sau bởi "A" hoặc "B". Nếu đó là "B" thì hãy đặt "A".
Nếu không, hãy nối chuỗi (như tôi làm) NHƯNG TRƯỚC KHI bắt đầu khối nhận xét cuối cùng.
Tôi làm cách nào để thực hiện việc này?
Tôi không giỏi viết kịch bản.
Cảm ơn!

+0

a) gì bạn xem xét khối cuối cùng của bình luận? b) Bạn có ý nghĩa gì là "Một số thông số" được theo sau bởi "A" hoặc "B", điều đó có nghĩa là chỉ có một khoảng trắng hoặc khoảng cách giữa chúng? – bbaja42

+0

@ bbaja42: a) Có một loạt các dòng bắt đầu bằng '#' ở phần cuối của công cụ nhận xét tệp. Tôi muốn viết trước những điều này nếu nó dễ dàng/có thể. b) Tôi đang cố gắng để làm cho nó mạnh mẽ và đưa vào tài khoản cơ hội có nhiều hơn 1 không gian hiện tại – Jim

Trả lời

-1

Một perl one-liner

perl -i.BAK -pe 'if(/^SomeParameter/){s/B$/A/;$done=1}END{if(!$done){print"SomeParameter A\n"}} theFile 

một bản sao lưu theFile.BAK sẽ được tạo ra (tùy chọn -i). Một phiên bản chi tiết hơn, có tính đến các bình luận cuối cùng, để được kiểm tra. Nên được lưu trong một tập tin văn bản và thực hiện perl my_script.pl hoặc chmod u+x my_script.pl./my_script.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

my $done = 0; 
my $lastBeforeComment; 
my @content =(); 
open my $f, "<", "theFile" or die "can't open for reading\n$!"; 
while (<$f>) { 
    my $line = $_; 
    if ($line =~ /^SomeParameter/) { 
    $line =~ s/B$/A/; 
    $done = 1; 
    } 
    if ($line !~ /^#/) { 
    $lastBeforeComment = $. 
    } 
    push @content, $line; 
} 
close $f; 
open $f, ">", "theFile.tmp" or die "can't open for writting\n$!"; 
if (!$done) { 
    print $f @content[0..$lastBeforeComment-1],"SomeParameter A\n",@content[$lastBeforeComment..$#content]; 
} else { 
    print $f @content; 
} 
close $f; 

khi nó là ok sau đó thêm những điều sau đây:

rename "theFile.tmp", "theFile" 
+0

Tôi cần phải làm điều đó từ một tập tin spec.I không chắc chắn nếu tôi có thể sử dụng perl – Jim

+0

chắc chắn, bạn có thể đọc nó với perl, làm thế nào để bạn đọc tập tin spec? –

+0

Tôi không đọc nó.Tôi sẽ đặt kịch bản trong một tập tin đặc biệt – Jim

2
awk 'BEGIN{FLAG=0} 
    /parameter a/{FLAG=1} 
    END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}}' your_file 

BEGIN{FLAG=0} -initializing một biến cờ trước khi bắt đầu xử lý tệp.

/parameter a/{FLAG=1} đặt cờ nếu thông số được tìm thấy trong tệp.

END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}} -Cuối cùng thêm các dòng vào cuối của tập tin

+0

Nếu bạn có thể giải thích những gì bạn đang làm nó sẽ là tuyệt vời! – Jim

+0

@Jim ... chỉ là nó không có expalnation doesnt có nghĩa là bạn nên bỏ phiếu. – Vijay

+0

Tôi đã không ** không ** downvote !!!! Tôi sẽ upvote (+1) để khắc phục điều này. – Jim

7

Thứ nhất, thay đổi bất kỳ SomeParameter dòng nếu họ đã tồn tại. Điều này sẽ làm việc với các dòng như SomeParameter hoặc SomeParameter B, với bất kỳ số lượng không gian thêm:

sed -i -e 's/^ *SomeParameter\(\+B\)\? *$/SomeParameter A/' "./theFile" 

Sau đó thêm dòng nếu nó không tồn tại:

if ! grep -qe "^SomeParameter A$" "./theFile"; then 
    echo "# Adding parameter" >> ./theFile  
    echo "SomeParameter A" >> ./theFile  
fi