Linux

egrep有什麼用[:pr我nt:[:pr一世n噸:[:print:] bash 中的命令?

  • October 13, 2021

我正在改進一個讀取文件並處理它的 shell 腳本。基本上,輸入文件包含一個標題記錄,然後是一些詳細記錄。我只想從文件中獲取標題記錄。

$ cat sample_file.txt
header1,header2,header3,header4
value1,value2,value3,value4

現有腳本使用以下命令從文件中獲取標頭:

$ cat sample_file.txt | head -1 | egrep -o '[[:print:]]' |  tr '\n' '\0'
header1,header2,header3,header4$

我不確定egrep -o '[[:print:]]'在這裡做什麼。因為即使沒有egrep命令也可以像這樣放置

按原樣列印標題

$ cat sample_file.txt | head -1
header1,header2,header3,header4

或者在末尾不換行列印標題

$ cat sample_file.txt | head -1 |  tr '\n' '\0'
header1,header2,header3,header4$

的手冊頁egrep告訴以下內容,但不清楚何時[[:print:]]應該使用。

最後,在括號表達式中預定義了某些命名的字元類別,如下所示。他們的名字是不言自明的,他們是

$$ :alnum: $$,$$ :alpha: $$,$$ :cntrl: $$,$$ :digit: $$,$$ :graph: $$,$$ :lower: $$,$$ :print: $$,$$ :punct: $$,$$ :space: $$,$$ :upper: $$, 和$$ :xdigit: $$. 例如, $$ [:alnum: $$] 方法$$ 0-9A-Za-z $$,除了後一種形式取決於 C 語言環境和 ASCII 字元編碼,而前者獨立於語言環境和字元集。(請注意,這些類名中的方括號是符號名的一部分,除了分隔方括號列表的方括號外,還必須包括在內。)大多數元字元在列表中失去了特殊含義。要包含文字 ],請將其放在列表的首位。類似地,要包含文字 ^,請將其放在除第一個之外的任何位置。最後,要包含一個文字 - 將其放在最後。

你能幫我理解egrep '[[:print:]]'選項的用法以及我們在哪裡使用它。

括號表達式類似於[abc],它匹配其中的任何一個字元。例如[abc]將匹配aor b,但不匹配dor :。字元類可以在括號表達式中使用,以將整個類添加到括號表達式匹配的集合中。[[:print:]]將匹配單個可列印字元,而將控製字元、換行符和製表符排除在外。egrep,或者最好grep -E是列印任何與給定模式匹配的行,並且-o只列印匹配的部分,每行一個

例如,使用[:alpha:],冒號被省略:

$ echo ab:c | egrep -o '[[:alpha:]]'
a
b
c

因此,實際上,egrep -o '[[:print:]]'將列印輸入中的每個可列印字元,每行一個。然後tr '\n' '\0'將換行符更改為 NUL 字節,這樣您就可以獲得所有可列印的字元,其間有 NUL。我不確定這是否有意義,因為 NUL 並不比控製字元更好處理。如果您在 egless或中打開結果數據vim,您會看到 NUL 列印為^@,可能是彩色的。

同樣,cat sample_file.txt | head -1 | tr '\n' '\0'不會刪除換行符,而是用 NUL 替換它。


我不確定這裡的目標是什麼,但要刪除任何換行符和製表符,您可以使用tr -d

... | tr -d '\n\t'

並刪除所有不可列印的字元-d-c補充(反轉)匹配的字元集:

... | tr -dc '[:print:]'

(請注意,tr它不採用外部括號,就像您在正則表達式中需要的那樣。實際上,參數 totr就像正則表達式括號表達式的內部。)

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