Text-Processing
有沒有辦法用 grep 或 egrep 格式化輸出,並在輸出實例之間使用分隔符?
我有一個包含大量數據的數據集:
ID Number: A00001 Name: John Smith Address: 123 Any Street City: AnyTown State: Ohio Zip: 12345 ID Number: A00002 Name: Jane Doe Address: 123 Any Street City: AnyTown State: Nebraska Zip: 12346 ID Number: C00003 Name: Jim Shields Address: 123 Any Street City: AnyTown State: Alaska Zip: 12347 ID Number: D11111 Name: Mary Ellis Address: 123 Any Street City: AnyTown State: Nevada Zip: 12348
我想提取數據並將其分開,使其看起來像這樣:
ID Number: A00001 Name: John Smith Zip: 12345 ========================= ID Number: A00002 Name: Jane Doe Zip: 12346 ========================= ID Number: C00003 Name: Jim Shields Zip: 12347 ========================= ID Number: D11111 Name: Mary Ellis Zip: 12348 =========================
我已經嘗試了我能找到的每一個 grep 和 egrep 選項,但我能得到的最接近的是在每一行輸出之間放置一個空行(新行)。
grep
是一種模式匹配工具,而不是文本重新格式化工具。使用類似sed
,awk
或的東西perl
。例如:$ awk '/^(ID Number|Name|Zip):/; /^[[:blank:]]*$/ { print "=========================" }' ID Number: A00001 Name: John Smith Zip: 12345 ========================= ID Number: A00002 Name: Jane Doe Zip: 12346 ========================= ID Number: C00003 Name: Jim Shields Zip: 12347 ========================= ID Number: D11111 Name: Mary Ellis Zip: 12348
這
[[:blank:]]*
是為了匹配任何看起來像空但實際上包含水平空間(如空格或製表符)的行……這比你想像的更常見,因為單憑你的眼睛很難看到它。或者,使用 perl:
perl -l -n -e 'print if /^(ID Number|Name|Zip):/; print "=" x 25 if /^\h*$/' input.txt
或與
sed
. 首先,如果您有 GNU sed 或其他理解 perl RE 的\h
“水平空間”的 sed:sed -n -E -e '/^(ID Number|Name|Zip):/p; s/^\h*$/=========================/p' input.txt
否則,使用任何 sed:
sed -n -E -e '/^(ID Number|Name|Zip):/p; s/^[[:blank:]]*$/=========================/p' input.txt