如何解决Notepad ++ 替换生成多行的两个字符串之间的文本并保留其间的某些部分字符串
我使用 show create table 命令提取了许多 hive 表。
输出是这样的:
CREATE EXTERNAL TABLE MYSCHEMA.MyTABLE(
`col1` string,`col2` string)
PARTITIONED BY (
`data_as_of_date` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'input.regex'='^(.*?)~}\\|(.*?)~}\\|(.*?)$')
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetoutputFormat'
LOCATION
'/mnt/data/schema/layer/domain/MYTABLE'
TBLPROPERTIES (
'DO_NOT_UPDATE_STATS'='true','STATS_GENERATED_VIA_STATS_TASK'='true','last_modified_by'='user','last_modified_time'='1603077305','numRows'='23483974','parquet.compression'='SNAPPY','transient_lastDdlTime'='1608243340');
我想替换...之间的文本
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'input.regex'='^(.*?)~}\\|(.*?)~}\\|(.*?)$')
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetoutputFormat'
LOCATION
'/mnt/data/schema/layer/domain/MYTABLE'
TBLPROPERTIES (
'DO_NOT_UPDATE_STATS'='true','transient_lastDdlTime'='1608243340');
...到...
STORED AS PARQUET
LOCATION '/mnt/data/schema/layer/domain/MYTABLE'
TBLPROPERTIES('parquet.compression'='SNAPPY');
...使用记事本++。
在这里,如果您观察到,LOCATION 参数应与原始参数保持不变,其余部分应如上所述替换。基本上,替换是跨多行产生的,我也保留了文本的一部分。有人请指导我可以在 Notepad++ (v7.8.2) 中使用的正则表达式。
最终结果应该是这样的:
CREATE EXTERNAL TABLE MYSCHEMA.MyTABLE(
`col1` string,`col2` string)
PARTITIONED BY (
`data_as_of_date` string)
STORED AS PARQUET
LOCATION '/mnt/data/schema/layer/domain/MYTABLE'
TBLPROPERTIES('parquet.compression'='SNAPPY');
有很多表,每个表都有不同的 LOCATION 参数。不希望 LOCATION 如上所述被替换。
如果我可以分两部分来做这件事也很好。首先替换 LOCATION 之上的所有内容,然后替换 TBLPROPERTIES(如果无法在单个正则表达式中完成)。
解决方法
- Ctrl+H
- 查找内容:
ROW FORMAT SERDE[\s\S]+?(LOCATION\s+.+\R)[\s\S]*?TBLPROPERTIES[^)]+?\);
- 替换为:
STORED AS PARQUET \n$1TBLPROPERTIES\('parquet.compression'='SNAPPY'\);
- 检查 匹配案例
- 检查 环绕
- 检查 正则表达式
-
取消勾选
. matches newline
- 全部替换
说明:
ROW FORMAT SERDE # literally
[\s\S]+? # 1 or more any character,including newline,not greedy
( # group 1
LOCATION # literally
\s+ # 1 or more spaces
.+ # 1 or more any character but newline
\R # any kind of linebreak
) # end group
[\s\S]*? # 1 or more any character,not greedy
TBLPROPERTIES # literally
[^)]+? # 1 or more any character that is not closing parenthesis
\); # closing parenthesis and semicolon
替换:
STORED AS PARQUET
\n
$1
TBLPROPERTIES\('parquet.compression'='SNAPPY'\);
屏幕截图(之前):
屏幕截图(之后):
,我能够使用两个单独的查找和替换正则表达式来做同样的事情。不知道它会这么简单,做了 2 次查找和替换。
-
替换:
ROW FORMAT SERDE.*?LOCATION
与:STORED AS PARQUET\r\nLOCATION
-
替换:
TBLPROPERTIES.*?\)
与:TBLPROPERTIES \(\r\n 'parquet.compression'='SNAPPY'\)
我很难在单个正则表达式中做到这一点。有人吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。