2017-04-24 19 views
0

設定ファイルを追加、削除、編集できるスクリプトを作成中です。私はそれを少しテストし、少なくとも1つのファイルで動作するように思えますが、.configまたはfi.configを実行して、目的の動作を実行できるようにしたいと考えています。設定ファイルを編集するスクリプト

私は助けていただきありがとうございます。

設定ファイルが

-- Config File 
-- Environment DEV7 
------------------------------------------------------------------------------- 

------------------------------------------------------------------------------- 
-- General properties 
------------------------------------------------------------------------------- 

com.x.yy.zz.version=2.0.2 

com.x.yy.zz.instanceRole.ServerA=PRIMARY 
com.x.yy.zz.instanceRole.ServerB=SECONDARY 

com.x.yy.zz.StopDelay=30 
com.x.yy.zz.sourceType=t 
com.x.yy.zz.sNumberInc=20000 
com.x.yy.zz.sNumberMin=20000 
com.x.yy.zz.sNumberMax=9980000 

so -a would allow me to add a line after something 
ex. -a StopDealy New 
com.x.yy.zz.StopDelay=30 
New 





#!/bin/bash 
i=1 

usage() 
{ 
     echo "test usage" 
} 

if [[ $# -gt 4 ]] 
then 
     i=2 
fi 

while [[ $# -gt $i ]] 
do 
key="$1" 

case $key in 
     -f|--file) 
     file="$2" 
     shift 
     ;; 
    -a|--after) 
    sed -i "/$2/a $3" $file 
    #shift # past argument 
    ;; 
    -b|--before) 
    sed -i "/$2/i $3" $file 
     #shift 
     ;; 
    -d|--delete) 
    sed -i "/$2/d" $file 
     #shift 
     ;; 
     -e|--edit) 
     sed -ie "s/$2/$3/g" $file 
     shift 
     ;; 
    *) 
      usage 
    ;; 
esac 
shift # past argument or value 
done 
+0

設定ファイルの内容は何ですか?そして、-a、-b、または-dのいずれかを実行した後、どのように見えるようにしたいのですか? –

+0

設定ファイルは、バージョン番号、IPアドレス、パスワードなどの大容量プロパティファイルです。-aが一致した後に目的の行を追加します。-bは前ですが-dは行を削除します。置き換えます。ほとんどの場合、私は1つの設定ファイルで作業しているだけですが、別の設定ファイルの束になる可能性があります。 –

+0

質問を編集して例を追加してください。 –

答えて

0

これに似ちょうど大きく見える私はまだそれをテストしていないが、これは私はあなたが達成したい理解して何に最も近いバージョンです。

#!/bin/bash 

usage() { 
     echo "Usage: $0 -f file1 -f *.txt -[abde] ... -f file3 ... -[abde] ... " 
} 

# Do all the required action on one file 
do_work() { 
    file="$1" # 1st argument must be the file to work on 
    shift 
    while [[ $# -gt 0 ]]; do 
     case "$1" in 
      -f|--file) while [[ ! "$2" = -* && $# -gt 0 ]]; do shift; done ;; # Ignore any "file" since we have one to work on. 
      -a|--after) sed -i "/$2/a $3" $file; shift 2 ;; 
      -b|--before) sed -i "/$2/i $3" $file; shift 2 ;; 
      -d|--delete) sed -i "/$2/d" $file;  shift ;; 
      -e|--edit) sed -ie "s/$2/$3/g" $file; shift 2 ;; 
     esac 
     shift # past argument or value 
    done 
} 

# Check the arguments for files and print the valid ones 
# Other arguments will just be skipped 
# Invalid arguments will be displayed. 
identify_files() { 
    while [[ $# -gt 0 ]]; do 
     case "$1" in 
      -f|--file) # Validate the the file exists (just in case) 
       # check each following argument until next option 
       # ... or end of arguments 
       while [[ ! "$2" = -* && $# -gt 0 ]]; do 
        if [[ -f "$2" ]]; then 
         echo "$2" 
        else 
         echo "Error: Invalid file '$2'." >&2 
        fi 
        shift 
       done ;; 
      -[abe]) shift 2 ;; 
      -d)  shift ;; 
      -h)  usage >&2; exit ;; 
      *) echo "Invalid otpion '$1'" >&2 ;; 
     esac 
     shift 
    done 
} 

# Do the required actions on all files received in the options 
for File in $(identify_files "[email protected]"); do 
    do_work "$File" "[email protected]" 
done 

## Alternative on predefined files (not the ones received as arguments) 
## Usage: $0 -[abde] ... 
#for File in $(ls *.config); do 
# do_work "$File" "[email protected]" 
#done 
+0

私は助けに感謝します。私は正しいことをしていないかもしれませんが、* .txtと "* .txt"と.txtを試してみましたが、最初のファイルで動作しますが、2番目の有効なファイルに無効なファイルがあります。またesacの前に行う必要があり、ループの下部にesacを削除する必要があります。無効なotpion 'f.txt' f.txtは実際のファイルです –

+0

私は複数のファイルを把握しました。今テストしていますが、私が探していたものだと思います。ありがとうございました! –

+1

ファイル内の* .txtを行う方法はありますか?または単に-f file.txt -f f.txtを実行する必要がありますか? –

関連する問題