python - 多行搜索和替换
问题描述
我有一个非结构化文件,我想搜索和替换字符串模式。
- 必须替换 SELECT 和 FROM 字符串之间存在的字符串;这种模式之外的人应该保持原样。
文件格式就像
col4 is required to be upper so
make col4 upper
abc 12345 !$% DATA SELECT
col1 as col1,
col2 as col2.
col3,
sch.col4 as col4,
sch.tab.col4 as col4_1,
col4,
col5 FROM sch.tab
xyz 34354 ^&* DATA SELECT
col5 as col5,
col3,
col4,
col4 as col4,
col4 FROM
blah blah blah
我想更换:
col4,
和upper(col4) as col4,
sch.col4
和upper(sch.col4)
sch.tab.col4
和upper(sch.tab.col4)
col4
(如果 col4 在选择查询的末尾)upper(col4) as col4
该文件位于 linux 服务器上,我尝试使用 sed 和 awk 缩小包含 col4 的行,但无法从那里继续前进。
我能够使用以下方法识别一种模式
awk '/SELECT/,/FROM/' test_file.txt | awk '/col4/{print $0, NR}' | awk -F AS '{print $1}'
查找 SELECT 和 FROM 之间的文本
识别 col4
打印第一个字段 的行
sed -n -e '/SELECT/,/FROM/p' -e 's/\(\([a-zA-Z]\{1,\}\.\)\{0,\}\)col4/upper(\0)/g' test_file.txt
并使用 sed
实际的:
col4 is required to be upper so
make col4 upper
abc 12345 !$% DATA SELECT
col1 as col1,
col2 as col2.
col3,
sch.col4 as col4,
sch.tab.col4 as col4_1,
col4,
col5 FROM sch.tab
xyz 34354 ^&* DATA SELECT
col5 as col5,
col3,
col4,
col4 as col4,
col4 FROM
blah blah blah
预期结果:
col4 is required to be upper so
make col4 upper
abc 12345 !$% DATA SELECT
col1 as col1,
col2 as col2.
col3,
upper(sch.col4) as col4,
upper(sch.tab.col4) as col4_1,
upper(col4) as col4,
col5 FROM sch.tab
xyz 34354 ^& DATA SELECT
col5 as col5,
col3,
upper(col4) as col4,
upper(col4) as col4,
upper(col4) as col4 FROM
blah blah blah
任何帮助深表感谢!!
解决方案
使用 sed:
sed '/SELECT/,/FROM/ {s/as col4 *//;s/\([A-Za-z]*\.\)\{0,\}col4/upper(&) as col4/;}' file
说明:
s/as col4 *//
:现有as col4
被删除以防止第二次替换后重复\([A-Za-z]*\.\)\{0,\}col4
: 搜索 0 个或多个字母和点的组合,后跟col4
upper(&) as col4/;
: 替换为新文本(使用 插入匹配的字符串&
)
推荐阅读
- javascript - 输入数量超过可用库存时如何生成警报
- c# - 我的代码永远不会到达 Monitor.Pulse 行
- php - Symfony 查询 - 检索一个用户的所有项目
- python - 我如何知道数据包将来自或来自 python 中的哪个 url
- rest - 使用 Spring Boot 和 JUnit 对 Rest 服务进行单元测试
- java - JSOUP 解析返回主页而不是提供 url
- python - 使用 Python 更新标签 Tkinter
- angular - 找不到模块:错误:无法解析“angular2-router-loader”
- ansible - 如何从用_items制作的循环中使用检查ansible任务结果?
- visual-studio - VS2017 不包含 Microsoft.Bcl.Build,而 VS2015 包含