我有一個17GB的管道分隔的.txt文件,並且需要將第32和第33個管道之間的超過10個字符的任何字符串替換爲它們的前10個字符以填充一個數據庫列,無需在崇高文本中打開該文件;所以需要通過Java或AIX-BASH來完成。在regex101.com
我試圖實現在下面的帖子中提出的觀點:用子串替換後續分隔符之間的字符串
,但它不匹配的模式僅限制到我的替換字符串。
樣品輸入:
|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)
有效期爲與$
引用的字符串,如$33
內awk
如果你是在Unix/Linux上運行,爲什麼不使用'sed'? –
嘗試使用awk。這種情況很好。 – Malt
沒有缺陷,它捕獲非捕獲組,因爲它嵌套在捕獲組中,因此會被捕獲。使用其他類型的正則表達式,你可以不使用第一個捕獲組,因爲可以使用'\ K'標記。在regex101上試試'^(?:[^ |] * \ |){32} \ K(([^ |] {0,10})[^ | * *)(?= \ |)。不幸的是,Java不支持這個令牌(據我所知) – ctwheels