簡體   English   中英

sed替換文件字符串組

[英]sed replace group of files string

我試圖在多行中替換一個字符串。 現在已經很晚了,我會變得焦躁不安,也許有人會更喜歡為一些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"

...我還嘗試了上述語句,所有空格都被轉義了。 請幫忙!

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 - 每個輸入文件的就地編輯

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 $/使用分隔符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM