2012-10-22 9 views
5

Bir dosyayı bir komut dosyası aracılığıyla değiştirmem gerekiyor.
ben aşağıdakileri yapmanız gerekir: Belirli bir dize yoksa
sonra ekler. Koşullu olarak linux komut dosyasındaki bir dosyaya ekleme veya ekleme

Yani şu senaryoyu oluşturuldu:

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

Bu işler ancak bazı iyileştirmeler yapmak gerekir.
"SomeParameter" mevcut olup olmadığını kontrol edip daha sonra "A" veya "B" ile devam edip etmediğini kontrol etmeliyim. Eğer "B" ise o zaman "A" yapın.
Aksi takdirde, dize (yaptığım gibi), son yorumlar bloğunun başlangıcından ÖNCE.
Bunu nasıl yapabilirim?
Komut dosyasında iyi değilim.
Teşekkürler!

+0

a) son bloğu ne düşünüyorsunuz Bu ekstra boşluk herhangi bir sayı ile, SomeParameter veya SomeParameter B gibi hatları ile çalışması gerekir yorumlar? b) "Bazı Parametreler" in "A" veya "B" harfleri ile neyi kastediyorsunuz, sadece aralarında boşluk veya boşluk olduğu anlamına mı geliyor? – bbaja42

+0

@ bbaja42: a) Dosya yorumlama öğelerinin sonunda '#' ile başlayan bir dizi satır var. Kolay/mümkün ise bunlardan önce yazmak istiyorum. b) Ben sağlam yapmak ve 1'den fazla alan mevcut – Jim

cevap

-1

bir perl one-liner

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

theFile.BAK oluşturulacak bir yedek (-i seçeneği). Test edilecek son yorumları dikkate alan daha ayrıntılı bir sürüm.

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

sahip olma şansını hesaba katmaya çalışıyorum bir spec dosyasından yapmalıyım.Onun perl kullanabileceğinden emin değilim perl – Jim

+0

emin ile okuyabilirsiniz perl, spec dosyasını nasıl okuyorsun? –

+0

Bunu okumadım. Script'i bir spec dosyasına koyacağım – 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} başlamadan önce bir bayrak değişkeni -initializing: Bir metin dosyasına kaydedilir ve perl my_script.pl veya ./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; 

Tamam bir kez chmod u+x my_script.pl idam edilmeli sonra aşağıdaki ekleyin dosya işleme.

/parameter a/{FLAG=1} parametre dosyasında bulunursa bayrağı -ayarlama.

END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}}

nihayet

+0

Ne yaptığınızı açıklayabiliyorsanız, bu harika olurdu! – Jim

+0

@Jim ... sadece bu bir yoklama yok oylama anlamına gelmez anlamına gelmez. – Vijay

+0

Yaptım ** değil ** downvote !!!! Bunu düzeltmek için (+1) ekleyeceğim. – Jim

7

İlk dosyanın sonuna satırları ekleyerek, herhangi SomeParameter satırları değiştirmek zaten varsa. o yoksa

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

Sonra satırı ekleyin:

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