Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何用其他文件的内容替换文件中的字符串_Unix_Awk_Sed - Fatal编程技术网

Unix 如何用其他文件的内容替换文件中的字符串

Unix 如何用其他文件的内容替换文件中的字符串,unix,awk,sed,Unix,Awk,Sed,我使用ksh在AIX上,我需要一些帮助,因为我无法通过sed或awk实现 模板文件:(作为输入) ... varchar SelectStmt = 'REPLACE_SELECT_STATEMENT' ... 上述中应应用的值(基于Teradata中表名的输入,分别比较每列的列数据类型,并在必要时强制转换)通过awk实现,并重新定向到一个文件,该文件有多行(>=100和模板文件 $ cat temp ... varchar SelectStmt = 'REPLACE_SELECT_S

我使用
ksh
AIX
上,我需要一些帮助,因为我无法通过
sed
awk
实现 模板文件:(作为输入)

...  
varchar SelectStmt = 'REPLACE_SELECT_STATEMENT'
...

上述中应应用的值(基于Teradata中表名的输入,分别比较每列的列数据类型,并在必要时强制转换)通过awk实现,并重新定向到一个文件,该文件有多行(>=100和模板文件

$ cat temp 
...  
varchar SelectStmt = 'REPLACE_SELECT_STATEMENT'
...
内容

$ cat output 
SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
       CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
       ....
       CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';
Awk

假设输出文件不包含将被解释的
&
通过更换操作

可读性更好的版本

SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
       CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
       ....
       CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';
awk '  # Here read output file and save contents in variable r
       NR==FNR{
            r=(FNR>1?r RS:"") $0
            next
        }

        # Here read file temp
        {
           gsub(/REPLACE_SELECT_STATEMENT/,r)
        }1
   ' output temp 
awk 'BEGIN{
        search="REPLACE_SELECT_STATEMENT"
}
NR==FNR{
        r=(FNR>1?r RS:"") $0
        next
} 
# To take care of & char, credit : Ed Morton
s=index($0,search){ 
        $0 = substr($0,1,s-1) r substr($0,s+length(search)) 
}1' output temp
如果输出文件中包含
&
字符

可读性更好的版本

SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
       CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
       ....
       CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';
awk '  # Here read output file and save contents in variable r
       NR==FNR{
            r=(FNR>1?r RS:"") $0
            next
        }

        # Here read file temp
        {
           gsub(/REPLACE_SELECT_STATEMENT/,r)
        }1
   ' output temp 
awk 'BEGIN{
        search="REPLACE_SELECT_STATEMENT"
}
NR==FNR{
        r=(FNR>1?r RS:"") $0
        next
} 
# To take care of & char, credit : Ed Morton
s=index($0,search){ 
        $0 = substr($0,1,s-1) r substr($0,s+length(search)) 
}1' output temp
两者都提供输出

...  
    varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
           CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
           ....
           CAST(COLUMN600 AS INTEGER) 
    FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';'
 ...
...  
    varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
           CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
           ....
           CAST(COLUMN600 AS INTEGER) 
    FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';'
...
Perl

$ perl -pe 's/REPLACE_SELECT_STATEMENT/`cat output`/ge' temp
...  
varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
       CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
       ....
       CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';
'
...

非常好,谢谢你,阿克谢·赫格德。
$ perl -pe 's/REPLACE_SELECT_STATEMENT/`cat output`/ge' temp
...  
varchar SelectStmt = 'SELECT COLUMN1, CAST(COLUMN2 AS DECIMAL(10,3)),
       CAST(COLUMN3 AS VARCHAR(40)), COLUMN4,
       ....
       CAST(COLUMN600 AS INTEGER) 
FROM DATABASE1.TABLE1 WHERE COLUMN_DATE = '2017-01-31';
'
...