2012-10-22 16 views
5

Potrzebuję zmodyfikować plik za pomocą skryptu.
Potrzebuję wykonać następujące czynności:
JEŚLI określony ciąg NIE istnieje, a następnie dołóż go.Warunkowo dodaj lub dołącz do pliku w skrypcie linux

Stworzyłem więc następujący scenariusz:

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

To działa, ale trzeba dokonać pewnych ulepszeń.
Myślę, że byłoby lepiej, gdybym sprawdził, czy istnieje "SomeParameter", a następnie sprawdzić, czy jest po nim "A" lub "B". Jeśli jest to "B", a następnie wybierz "A".
W przeciwnym razie dołącz ciąg (tak jak ja) ALE PRZED rozpoczęciem ostatniego bloku komentarzy.
Jak mogę to zrobić?
Nie jestem dobry w pisaniu skryptów.
Dzięki!

+0

a) Co uważasz za ostatni blok komentarze? b) Co masz na myśli, mówiąc "Jakiś parametr" następuje po "A" lub "B", czy oznacza to tylko spację lub spacje między nimi? – bbaja42

+0

@ bbaja42: a) Istnieje szereg linii zaczynających się od '# 'na końcu komentarzy do plików. Chciałbym napisać przed nimi, jeśli jest to łatwe/możliwe. b) Próbuję uczynić go solidnym i brać pod uwagę szansę posiadania więcej niż jednego wolnego miejsca – Jim

Odpowiedz

-1

Perl jedno-liner

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

kopia zapasowa zostanie utworzona theFile.BAK (opcja -i). Bardziej szczegółowa wersja, która uwzględnia ostatnie komentarze, do przetestowania. Powinny być zapisane w pliku tekstowym i wykonywane perl my_script.pl lub 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; 

raz jest ok następnie dodać:

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

Potrzebuję zrobić to z pliku spec.Nie jestem pewien, czy mogę użyć perl – Jim

+0

czy możesz go przeczytać z perl, jak czytasz plik spec? –

+0

Nie czytam tego. Umieszczę skrypt w pliku spec – 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 zmienną flagi przed rozpoczęciem przetwarzanie plików.

/parameter a/{FLAG=1} -ustawienie flagi, jeśli parametr znajduje się w pliku.

END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}} -Wreszcie dodając linie na końcu pliku

+0

Jeśli mógłbyś wyjaśnić, co robisz to byłoby wspaniale! – Jim

+0

@ Jim ... tylko, że nie ma expalnation nie oznacza, że ​​należy głosować w dół. – Vijay

+0

Zrobiłem ** nie ** downvote !!!! Będę upvote (+1), aby to poprawić. – Jim

7

pierwsze, zmienić żadnych SomeParameter linii jeśli już istnieje. To powinno działać z liniami takimi jak SomeParameter lub SomeParameter B, z dowolnej liczby dodatkowych miejsc:

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

następnie dodać linię, jeśli nie istnieją:

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