sed 替换文件组字符串

sed replace group of files string

我正在尝试替换多行中的字符串。已经很晚了,我变得焦躁不安,也许有人更愿意试一试以获得一些 SO 点。我要替换的字符串是下面 SQL 中的 'STORED AS TEXTFILE'...

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"

...而且我还尝试了上面的语句,所有空格都被转义了。请帮忙!

sed 逐行处理文件 link 给出了多行处理的解决方案 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

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

gawk 就地编辑 方法 - 自 GNU awk 4.1.0 起可用:

gawk -i inplace '[=10=]~/STORED AS TEXTFILE/{ [=10=]="ROW FORMAT DELIMITED" ORS "FIELDS TERMINATED BY 7,7" ORS [=10=] }1' file*
  • -i inplace - 就地 编辑每个输入文件