用子字符串替换后续分隔符之间的字符串

Posted

技术标签:

【中文标题】用子字符串替换后续分隔符之间的字符串【英文标题】:Replace string between subsequent delimiters with substring 【发布时间】:2018-03-29 12:41:02 【问题描述】:

我有一个 17GB 管道分隔的 .txt 文件,需要将第 32 和第 33 管道之间超过 10 个字符的任何字符串替换为其前 10 个字符,以便在不打开文件的情况下填充数据库列在崇高的文本中;所以它需要通过 Java 或 AIX-BASH 来完成。在regex101.com,我试图实现以下帖子中提出的想法:

RegEx: Match nth occurence

但它并不仅仅将匹配的模式限制为我的替换字符串。

示例输入:

|12210|IA||15||i956-743||||||l.4073||||a5015b3ed||l.464939|IC|||06 06:18:17||wireered||ENTITY|wirvered|2||||NoPodfoundorpoddoesnothaveedgetob-rd=l.415.63Z|REY||||RY|REY||

预期输出:

...|NoPodfundddorpoddoesnot...|... 更改为...|NoPodfundd|...

替换/截断后的完整输出字符串:

|12210|IA||15||i956-743||||||l.4073||||a5015b3ed||l.464939|IC|||06 06:18:17||wireered||ENTITY|wirvered|2||||NoPodfundd|REY||||RY|REY||

尝试正则表达式匹配:

^(?:[^|]*\|)32[^|]+\| 匹配从开头到第 33 个 | 的所有内容,所以是 |12210.......l.415.63Z|,但我希望它只匹配管道 32 和 33 之间的字符串,特别是 NoPodfoundorpoddoesnothaveedgetob-rd=l.415.63Z,用于替换目的。

更新 1; 2017 年 10 月 18 日:

(^(?:[^|]*\|)32[^|]0,10)([^|]*)(\|.*$) 组捕获替换为\1\3 提供了所需的结果。但是这场比赛肯定有缺陷,因为它似乎在捕获一个非捕获组(?:[^|]*\|)

更新 2; 2017 年 10 月 19 日:

在 PUTTY 命令行中尝试了以下命令,但它没有编辑文件:

cat subStrTest.txt
awk 'BEGINFS=OFS="|"$33=substr($33,1,10) 1' subStrTest.txt

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html 建议

string = substr(string,startIndex,numOfCharacters)

是有效的语法,至少对于gawk,但我不知道是否赋值

$33=substr($33,1,10)

对于用$ 引用的字符串有效,如$33 中的awk

【问题讨论】:

如果你在 unix/linux 上运行,为什么不使用sed 尝试使用 awk。非常适合这种情况。 没有缺陷,它是捕获非捕获组,因为它嵌套在捕获组中,因此会被捕获。使用其他风格的正则表达式,您可以不使用第一个捕获组,因为可以使用 \K 令牌。在 regex101 上尝试 ^(?:[^|]*\|)32\K(([^|]0,10)[^|]*)(?=\|)。不幸的是,Java 不支持这个令牌(据我所知) 是的,这是 awk 的工作。猜猜它会是这样的:awk 'BEGIN FS="|"; OFS="|"; $33= substr ($33,1,10); print; ' 请查看这个问题的答案:***.com/questions/46600250/… 我认为只需稍作调整,该解决方案就会满足您的需求。它与上面的 Lorinczy 基本相同。 【参考方案1】:

您可以创建匹配组并将其替换为其他数据 ^(?:[^|]*\|)32([^|]+)\|

【讨论】:

【参考方案2】:

See regex in use here

正则表达式

^((?:[^|]*\|)32)(([^|]0,10)[^|]*)(?=\|)

替换

\1\3

【讨论】:

以上是关于用子字符串替换后续分隔符之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何多次替换两个分隔符/字符串之间的唯一字符串

使用 preg_replace_callback 查找并替换具有可变数量参数的函数签名

用于替换符号的正则表达式

Python爬虫编程思想(35):用正则表达式搜索替换和分隔字符串

JavaScript 字符串替换中的子匹配组引用是不是有分隔符/消歧语法?

lua lpeg 表达式在分隔符之间没有 gsub