Notepad ++ 替换生成多行的两个字符串之间的文本并保留其间的某些部分字符串

如何解决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'\);

屏幕截图(之前):

enter image description here

屏幕截图(之后):

enter image description here

,

我能够使用两个单独的查找和替换正则表达式来做同样的事情。不知道它会这么简单,做了 2 次查找和替换。

  1. 替换:ROW FORMAT SERDE.*?LOCATION 与:STORED AS PARQUET\r\nLOCATION

  2. 替换:TBLPROPERTIES.*?\) 与:TBLPROPERTIES \(\r\n 'parquet.compression'='SNAPPY'\)

我很难在单个正则表达式中做到这一点。有人吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?