2012-10-22 20 views
5

スクリプトを使ってファイルを変更する必要があります。
私は次のことを行う必要があります。
特定の文字列が存在しない場合は追加してください。条件付きでlinuxスクリプトでファイルを追加または追加する

だから私は、次のスクリプトを作成しました:

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

これは動作しますが、私はいくつかの改善をする必要があります。
「SomeParameter」が存在するかどうかを確認し、「A」または「B」が続くかどうかを確認するとよいでしょう。それが "B"の場合は "A"にします。
それ以外の場合は、コメントの最後のブロックの開始前に(私のように)文字列を追加してください。
どうすればいいですか?
スクリプトがうまくいかないです。
ありがとうございます!

+0

a)は、あなたがの最後のブロックをどう考えますかコメント? b)「いくつかのパラメータ」の後ろに「A」または「B」が付いているということは、それらの間にスペースまたはスペースしかないことを意味しますか? – bbaja42

+0

@ bbaja42:a)ファイルコメントの最後に '#'で始まる一連の行があります。これらの前に簡単に書くことができます。 b)私はそれを堅牢にし、1つ以上のスペースがある可能性を考慮に入れようとしています。 – Jim

答えて

-1

perlのワンライナー

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

theFile.BAKが作成されるバックアップ(-iオプション)。テストする最後のコメントを考慮した、より冗長なバージョン。

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

私はspecファイルからそれを行う必要があります。私はperlを使用できるかどうかわかりません – Jim

+0

確かに、 perl、どのようにspecファイルを読んでいますか? –

+0

私はそれを読んでいません。私はスクリプトをスペックファイルに入れます – 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:テキストファイルに保存し、perl 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; 

それがOKになるとchmod u+x my_script.plを実行する必要があることは、次を追加しますファイル処理。

/parameter a/{FLAG=1} - パラメータがファイル内に見つかった場合、フラグを設定します。

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

が - 最後

+0

あなたがしていることを説明できるなら、それは素晴らしいでしょう! – Jim

+0

@ジム...ちょうどそれはexpalnationを持っていないdoesntはあなたが投票するべきであることを意味します。 – Vijay

+0

私は**しなかった** downvote !!!!私はこれを修正するupvote(+1)します。 – Jim

7

まずファイルの末尾に行を追加し、任意のSomeParameterラインを変更する彼らはすでに存在している場合。これは、余分なスペースの任意の数で、SomeParameterまたはSomeParameter Bのようなラインで動作する必要があります。それが存在しない場合は

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

その後の行を追加します。

if ! grep -qe "^SomeParameter A$" "./theFile"; then 
    echo "# Adding parameter" >> ./theFile  
    echo "SomeParameter A" >> ./theFile  
fi 
関連する問題