将select语句中的文本从一个文件替换为另一个文件

时间:2013-08-15 23:17:57

标签: sql loops select for-loop sed

我的数据库有很多视图,需要更新每个视图中的select语句。

我在一个目录和一个名为sql的子目录中的文件中名为 viewname.txt 的所有select语句;我有所有的视图 viewname.sql 。我想运行一个脚本从 viewname.txt 获取文本,并在sql子目录中的正确的 viewname.sql 中替换select语句。

我试过在每个.sql文件中附加SELECT之后的文本:

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

非常感谢任何帮助!

迪基

1 个答案:

答案 0 :(得分: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/*

你必须将新文件放到适当的位置,但它现在已经接近我了。