2017-10-17 138 views
0

我有一个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,用于更换的目的。

update 1; 10/18/17:

(^(?:[^|]*\|){32}[^|]{0,10})([^|]*)(\|.*$)\1\3的组捕获取代提供了期望的结果。但是这场比赛必须有一个缺陷,因为它似乎捕获了一个非捕获组(?:[^|]*\|)

update 2; 17年10月19日:

试图腻子命令行下面的命令,但它不编辑该文件:

cat subStrTest.txt 
awk 'BEGIN{FS=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)

有效期为与$引用的字符串,如$33awk

+0

如果你是在Unix/Linux上运行,为什么不使用'sed'? –

+1

尝试使用awk。这种情况很好。 – Malt

+0

没有缺陷,它捕获非捕获组,因为它嵌套在捕获组中,因此会被捕获。使用其他类型的正则表达式,你可以不使用第一个捕获组,因为可以使用'\ K'标记。在regex101上试试'^(?:[^ |] * \ |){32} \ K(([^ |] {0,10})[^ | * *)(?= \ |)。不幸的是,Java不支持这个令牌(据我所知) – ctwheels

回答

0

您可以匹配组,取代它的另一个数据 ^(?:[^|]*\|){32}([^|]+)\|

相关问题