2013-08-15 5 views
0

데이터베이스에 대한 많은 뷰가 있으며 각 뷰 내에서 select 문을 업데이트해야합니다.한 파일의 select 문에서 다른 텍스트로 바꾸기

모든 select 문은 viewname.txt이라는 하나의 dir과 sql이라는 하위 디렉토리에 있습니다. 나는 모든 전망이 viewname.sql입니다. 나는 viewname.txt에서 텍스트를 가져 와서 올바른 viewname.sql의 select 문을 sql sub dir에 바꾼다.

나는 각 .SQL 파일의 SELECT 후 텍스트를 추가하려면이 옵션을 시도 :

for i in */*; do 
    if ["../$(basename "${i}")" == "$(basename "${i}")"] 
    then 
    sed '/SELECT/a "$(basename "$i" .txt)"' "$(basename "$i" .sql)" 
    fi 
done 

어떤 도움을 크게 감사합니다!

디키

+0

'set -vx'로 쉘 디버거를 켜면'if' 테스트에서 명백한 논리 오류가 발생합니다. 'sed << - EOS #sed_cmds를 작은 따옴표없이 .... EOS'를 사용하여'HERE' 문서 안에'cat $ viewname.txt'를 사용할 수 있습니다. 꽤 확실한). 행운을 빕니다. – shellter

답변

1

이것은 가까이 AWK의 답변입니다 - 출력은 "viewname.sql.new"파일을 해당 아래의 SQL 디렉토리에 배치됩니다.

#!/usr/bin/awk -f 

# absorb the whole viewname.txt file into arr when the first line is read 
FILENAME ~ /\.txt$/ && FILENAME != last_filename { 
    last_filename = FILENAME 

    # get the viewname part of the file name 
    split(FILENAME, file_arr, ".") 

    while(getline file_data <FILENAME > 0) { 
     old_data = arr[ file_arr[ 1 ] ] 
     arr[ file_arr[ 1 ] ] = \ 
      old_data (old_data == "" ? "" : "\n") file_data 
    } 
    next 
} 

# process each line of the sql/viewname.sql files 
FILENAME ~ /\.sql$/ { 
    # strip the "/sql" from the front of FILENAME for lookup in arr 
    split(substr(FILENAME, 5), file_arr, ".") 
    if(file_arr[ 1 ] in arr) { 
     if($0 ~ /SELECT/) 
      print arr[ file_arr[ 1 ] ] > FILENAME ".new" 
     else 
      print $0 > FILENAME ".new" 
    } 
} 

내가 파일에이를 넣어 awkochmod +x라는 다음과 같은

awko *.txt sql/* 

당신은 위치에 새 파일을 MV해야처럼 실행,하지만 난 얻을 수 있습니다로는 가까이 지금.

관련 문제