2016-05-01 4 views
0

次のようなbashスクリプトが必要です: - [環境] = [ファイル名] = [プロパティキー] = [プロパティ値] - 入力ファイルに従って$ SOURCEディレクトリ内のすべてのプロパティを置き換えることによってすべてのファイルを変更します。 今、私は "置き換えて数えなさい"という点で立ち往生しています。awashとsedでbashが使えなくなります。

「置き換えると数える」フェーズまでコード:プロパティの値は任意の文字(などとすることができるので、私は成功せず、成功せず、次の試してみました

PROPERTIES_LIST=/home/user/test_scripts/envPropList.txt 

SOURCE=/home/user/test_scripts/source-directory 

PROPERTIES_LOCATION=/WEB-INF/classes/ 

PROPERTIES_SOURCE=$SOURCE$PROPERTIES_LOCATION 

ENV=$1 
echo "> Update for ENVIRONMENT: $ENV... Please wait!" 

NR=1 
while read line; do 
    IFS== read env prop <<< "$line" 
    if [[ $env == $ENV]] 
    then 
     IFS== read file key value <<< "$prop" 
     if [[ -z $file ]] || [[ -z $key ]] || [[ -z $value ]] 
     then 
      echo "> [ERROR] [LINE $NR] - WRONG/MISSING PROPERTY: $line" 
     else 
      //MODIFY $file BY REPLACE AND COUNT 
      //IF $key IS NOT FOUND AT ALL AN ERROR MESSAGE SHOULD BE DISPLAYED. ITERATION SHOULD CONTINUE 
      //IF $key IS FOUND MORE THEN ONCE, A WARNING MESSAGE SHOULD BE DISPLAYED. ITERATION SHOULD CONTINUE 

      echo "done" 
     fi 
    fi 
    NR=$(($NR + 1)) 
done <$PROPERTIES_LIST 

:&、/、.... ):

COUNT=$(grep -c "$key" $PROPERTIES_SOURCE$file) 
sed -i "s/${OLD}/${NEW}/g" $PROPERTIES_SOURCE$file 

awkは期待通りに働いていませんでした:

DEST=/home/user/test_scripts/test.txt 
OLD='asd.asd' 
NEW='test/test?test.test&test=test' 
COUNT=$(grep -c "$OLD" $DEST) 
#sed -i "s/#${OLD}#/#${NEW}#p/g" $DEST 
#echo "$OLD=$NEW" 
echo "nr de rezultate: "$COUNT 
awk -v OLD=$OLD -v NEW=$NEW ' 
    ($0 ~ OLD) {gsub(OLD, NEW); count++}1 
    END{print count " substitutions occured."} 
' "$DEST" 

と入力ファイルのため:

asd.asd 
ewrqfg 
qweasd.asdqwreqe 
asd asd.asd 
egd 
test 

私は次の出力があります。

test/test?test.testasd.asdtest=test 
ewrqfg 
qwetest/test?test.testasd.asdtest=testqwreqe 
test/test?test.testasd asdtest=test.asd 
egd 
test 

を私は$ NEWから "&" を削除した場合、すべてが正常になります。

答えて

0

それは推測だが、これは何をしたい、おそらくですので、あなたは、あなたの期待される出力を投稿しませんでした:

$ cat tst.sh 
dest='file' 
old='asd.asd' 
new='test/test?test.test&test=test' 
count=$(grep -c "$old" "$dest") 
#sed -i "s/#${old}#/#${new}#p/g" "$dest" 
#echo "$old=$new" 
echo "nr de rezultate: $count" 
awk -v old="$old" -v new="$new" ' 
    { 
     head = "" 
     tail = $0 
     lgth = length(old) 
     while (start = index(tail,old)) { 
      head = head substr(tail,1,start-1) new 
      tail = substr(tail,start+lgth) 
      count++ 
     } 
     print head tail 
    } 
    END { print count+0, "substitutions occured." } 
' "$dest" 

$ ./tst.sh file 
nr de rezultate: 3 
test/test?test.test&test=test 
ewrqfg 
qwetest/test?test.test&test=testqwreqe 
asd test/test?test.test&test=test 
egd 
test 
3 substitutions occured. 

は(あなたがGSUBを使用することはできません)として、あなたは、あなたが持っている代わりに、escaping hell just like if you used sedになりますindex()とsubstr()は置換文字のregexpsや後方参照ではなくリテラル文字列で動作するので、index()とsubstr

別名:常にシェル変数を引用し、すべての大文字のシェルでの使用は、慣習によってエクスポート変数用に予約されていますが、awkとシェルの両方では大文字の変数名は避けてください。

0

これは、私が必要とするものを正確に実行している "sed"コマンドによる解決です。私はこのスクリプトが実行されるときに変更される多くのプロパティが存在するため、実行速度がわからない。

Guysは建設的なフィードバックを歓迎している、私の解決策を超えるレビューをご用意ください。

PROPERTIES_SOURCE=$SOURCE$PROPERTIES_LOCATION 

MEDIUM=$1 
echo "> Update release for ENVIRONMENT: "$MEDIUM"... Please wait!" 

if [[ -z $1 ]] 
then 
    echo "> [ERROR] - Illegal script use. You have to send one of the following parameters representing environment name which will be updated:" 
    echo "> [ERROR] - DEV ST UAT PROD" 
    echo "> [ERROR] - Example: ./updateEnv.sh PROD" 
    exit 
fi 

nr=1 
while read -r line; do 
    IFS== read -r env prop <<< "$line" 
    if [[ $env == $MEDIUM ]] 
    then 
     IFS== read -r file key value <<< "$prop" 
     if [[ -z $file ]] || [[ -z $key ]] || [[ -z $value ]] 
     then 
      echo "> [ERROR] [LINE $NR] - wrong or missing property: $line" 
     else 
      esc_key=$(echo $key | sed -e 's/\./\\./g') 
      esc_val=$(echo $value | sed -e 's/\&\|\.\|\\\|\/\|\%/\\&/g') 
      occurances=$(grep -c "$key=" "$PROPERTIES_SOURCE$file") 
      if [[ $occurances > 1 ]] 
      then 
       echo "> [WARNING] [LINE $NR] - key found $occurances times: $key" 
      elif [[ $occurances < 1 ]] 
      then 
       echo "> [ERROR] [LINE $NR] - key was not found: $key" 
      fi 
      sed -i "s/${esc_key}=.*/${esc_key}=${esc_val}/g" $PROPERTIES_SOURCE$file 
     fi 
    fi 
    nr=$(($nr + 1)) 
done <$PROPERTIES_LIST 

はまた、私はsedのと違って、私の変数に文字列をエスケープするためにsedのいくつかと、あまりにものawkで成功しました:

STRING_OLD='asd.asd' 
STRING_NEW='[email protected]#$%^&*()_+-=[]\{}|;"<>~`' 
OLD=$(echo $STRING_OLD | sed -e 's/\./\\\\./g') 
NEW=$(echo $STRING_NEW | sed -e 's/\&\|\\/\\\\&/g') 
、交換awkのコードは次のようなものになるだろう:

awk -v OLD="$OLD" -v NEW="$NEW" ' 
    BEGIN {print "OLD:"OLD" and NEW:"NEW} 
     ($0 ~ OLD) {gsub(/OLD=.*/,OLD=NEW);}1 
' "$DEST" > "DEST.tmp" mv "DEST.tmp" "$DEST" 
関連する問題