Text-Processing

有沒有辦法用 grep 或 egrep 格式化輸出,並在輸出實例之間使用分隔符?

  • December 10, 2021

我有一個包含大量數據的數據集:

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

引用自:https://unix.stackexchange.com/questions/680892