sed替换文件字符串组

时间:2017-06-13 06:55:30

标签: regex linux bash sed spaces

我正在尝试替换多行中的字符串。现在已经很晚了,我会变得焦躁不安,也许有人会更喜欢为一些SO分数。我正在替换的字符串是'STORED as TEXTFILE',来自下面的SQL ...

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"

...我也尝试了上述语句,所有空格都被转义了。请帮忙!

2 个答案:

答案 0 :(得分:2)

gawk 就地编辑方法 - 自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 - 就地编辑每个输入文件

答案 1 :(得分:1)

逐行处理文件跟踪链接为多行处理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 $/不使用分隔符