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
- 就地 编辑每个输入文件
我正在尝试替换多行中的字符串。已经很晚了,我变得焦躁不安,也许有人更愿意试一试以获得一些 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
- 就地 编辑每个输入文件