egrep有什麼用[:pr我nt:[:pr一世n噸:[:print:] bash 中的命令?
我正在改進一個讀取文件並處理它的 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]
將匹配a
orb
,但不匹配d
or:
。字元類可以在括號表達式中使用,以將整個類添加到括號表達式匹配的集合中。[[: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
就像正則表達式括號表達式的內部。)