regex - 正则表达式删除不跟随特定字符串的换行符
问题描述
我有一个带有用户条目的分隔数据文件,我需要清理它。具体来说:
- 我要删除的自由文本字段中嵌入了换行符
- 列数可以从一行更改为下一行
- 每行的第一个字段应始终以模式开头
"INC\d{12}"
(双引号是模式的一部分)。 \n
如果没有紧跟模式,则每个都应替换为单个空格"INC\d{12}"
- 我目前在 cygwin 中使用 Perl(首选),但 awk 或 sed 答案也是可以接受的。
这是一些模拟输入数据(我保存到一个名为 的文件中test_input_so.txt
):
"INC000111111111", "field2", "field3"
"INC000222222222", "field2", "field3","INC000123456789 blahblah"
"INC000444444444", "fie"""ld2", "field3"
"INC000123
456789", "field2", "field3",
"INC000333333333", "INC000123456789", "field3""
"INC000555555555", "field2", "fiel
d3","field4"
这是上述数据的所需输出:
"INC000111111111", "field2", "field3"
"INC000222222222", "field2", "field3","INC000123456789 blahblah"
"INC000444444444", "fie"""ld2", "field3"
"INC000123456789", "field2", "field3",
"INC000333333333", "INC000123456789", "field3""
"INC000555555555", "field2", "field3","field4"
我已经尝试了几种负前瞻/落后的组合,但我不确定它为什么不起作用。
这是一个例子:
perl -pe 's/\n(?!"INC\d{12})/ /g;' test_input_so.txt
它剥离了 all \n
,但错误地删除了\n
后面应该保留的“INC123456789012”。
解决方案
perl -pe ...
一次使用一行,因此多行正则表达式对您没有任何好处。
切换到 Perl 可以更改您的-0
输入记录分隔符(Perl 的行概念),并允许您将整个输入作为单个字符串进行操作。
perl -0777 -pe 's/\n(?!"INC\d{12})/ /g;' test_input_so.txt
推荐阅读
- git - 我不确定我的本地存储库是否处于正确的状态以推送到我的远程
- angular - 未拾取 ActivatedRoute 参数
- c# - 对“MarshalByRefObject”类型的引用声称它是在“System.Runtime”中定义的,但找不到
- aws-lambda - 失败:ValidationException:检测到 1 个验证错误:“tableName”处的值“[object Object]”未能满足约束
- jwt - 如何将用户添加到 Zoom 帐户的 JWT 密钥?
- google-cloud-platform - 如何参数化 Kubeflow Pipelines 环境变量?
- html - 我的网站 CSS 动画有效,但之后链接不起作用
- linux - 如何检测我是否在 Linux 中的 Electron AppImage 中运行?
- java - Keycloak Federation Configuration,初始化服务时出现keystore/truststore错误
- python - python3使用模块内部的内部依赖解决相对导入