2017-10-17 253 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}([^|]+)\|

相關問題