sed替换一组文件字符串

问题描述:

我试图用多行代替一个字符串。现在已经很晚了,我正在变得焦躁不安,也许有人会更愿意为某些SO点而投篮。我替换字符串 '存储为TEXTFILE' 从下面的SQL ...sed替换一组文件字符串

PARTITIONED BY(load string, date string, source_file string) 
STORED AS TEXTFILE 
LOCATION '${staging_directory}/${tablename}'; 

,并使其看起来像......

PARTITIONED BY(load string, date string, source_file string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE 
LOCATION '${staging_directory}/${tablename}'; 

所以我的表达是

:%s/)\nSTORED AS TEXTFILE\nLOCATION '/)\rROW FORMAT DELIMITED \rFIELDS TERMINATED BY ',' \rSTORED AS TEXTFILE \rLOCATION '/g 

它在文件内工作(使用vim),但我无法让它在目录中的所有文件上使用一个命令。我已经尝试到目前为止......

sed -i "s/)\nSTORED AS TEXTFILE\nLOCATION '/)\rROW FORMAT DELIMITED \rFIELDS TERMINATED BY ',' \rSTORED AS TEXTFILE \rLOCATION '/g" 

...我也尝试了上述语句,所有的空格都逃脱了。请帮忙!由线下面的链接

呆子就地编辑方法 - 可从GNU AWK 4.1.0:

gawk -i inplace '$0~/STORED AS TEXTFILE/{ $0="ROW FORMAT DELIMITED" ORS "FIELDS TERMINATED BY \047,\047" ORS $0 }1' file* 
  • -i inplace - 就地编辑每个输入文件的
+0

这不适合我,我收到了一条使用信息。 –

+0

什么*使用信息*? – RomanPerekhrest

+0

用法:gawk [POSIX或GNU风格选项] -f progfile [ - ]文件... 用法:gawk [POSIX或GNU风格选项] [ - ]'程序'文件... POSIX选项:GNU long选项: -f progfile --file = progfile -F fs --field-separator = fs -v var = val --assign = var = val –

SED流程文件行给出用于多线处理的溶液https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string

否则在Perl的默认输入行分隔$/可以改变或未定义的(读取整个文件):

perl -i.BAK -pe 'BEGIN{undef$/}s/.../.../g' file 

阅读关于接受的链接答案的评论后,GNU sed有-z选项,它使用NUL字符作为行分隔符($\="\0"),而undef $/不使用分隔符。