2012-10-22 8 views
5

Ho bisogno di modificare un file tramite uno script.
Ho bisogno di fare quanto segue:
SE una stringa specifica NON esiste quindi aggiungila.Aggiunge o accoda condizionatamente un file nello script linux

così ho creato il seguente script:

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

Questo funziona ma ho bisogno di apportare alcuni miglioramenti.
Penso che sarebbe meglio se verificassi se "SomeParameter" esiste e poi vediamo se è seguito da "A" o "B". Se è "B", fallo "A".
Altrimenti aggiungere la stringa (come faccio io) MA PRIMA dell'inizio dell'ultimo blocco di commenti.
Come posso fare questo?
Non sono bravo a scrivere script.
Grazie!

+0

a) Quale ritiene sia ultimo blocco di Commenti? b) Cosa intendi con "Some Parameter" seguito da "A" o "B", significa solo uno spazio o spazi tra loro? – bbaja42

+0

@ bbaja42: a) Esiste una serie di righe che iniziano con '#' alla fine del file di commento. Vorrei scrivere prima se è facile/possibile. b) Sto cercando di renderlo robusto e prendere in considerazione la possibilità di avere più di 1 spazio presente – Jim

risposta

-1

A perl one-liner

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

una copia di backup verrà creato theFile.BAK (opzione -i). Una versione più dettagliata, che tiene conto degli ultimi commenti, da testare. Dovrebbe essere salvati in un file di testo ed eseguiti perl my_script.pl o 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; 

una volta che è ok quindi aggiungere il seguente:

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

Ho bisogno di farlo da un file spec. Non sono sicuro di poter usare perl – Jim

+0

sicuro, puoi leggerlo con perl, come leggi il file spec? –

+0

Non lo leggo. Metterò lo script in un file 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 una variabile bandiera, prima dell'inizio della elaborazione dei file.

/parameter a/{FLAG=1} -impostare il flag se il parametro si trova nel file.

END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}} -Infine aggiungendo le righe alla fine del file

+0

Se potessi spiegare cosa stai facendo sarebbe fantastico! – Jim

+0

@Jim ... solo che non ha expalnation non significa che si dovrebbe votare. – Vijay

+0

Ho fatto ** non ** downvote !!!! Io inviterò (+1) per rettificare questo. – Jim

7

In primo luogo, modificare le linee SomeParameter se già esistono. Questo dovrebbe funzionare con le linee come SomeParameter o SomeParameter B, con qualsiasi numero di spazi aggiuntivi:

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

quindi aggiungere la linea, se non esiste:

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