這個問題在這里已經有了答案: 使用 grep 查找兩個字串中的任何一個而不更改行的順序? (2 個回答) 2 小時前關閉。
新手 UNIX 用戶問題...
輸入檔案 ( location.txt) 是這樣的:
WGS_LAT deg 12
WGS_LAT min 30
WGS_LAT sec 05
WGS_LAT hsec 29
WGS_LAT northSouth North
WGS_DLAT decimalDegreesLatitude 12.501469
WGS_LONG deg 07
WGS_LONG min 00
WGS_LONG sec 05
WGS_LONG hsec 61
WGS_LONG eastWest West
WGS_DLONG decimalDegreesLongitude -70.015606
我想得到所有以WGS_LATor開頭的行WGS_DLAT。
首先,grep您為這項作業推薦的工具是什么?
第二,如果是,那么如何表達模式?所有這些都失敗了:
grep ^WGS_LAT|^WGS_DLAT location.txt
grep ^(WGS_LAT|WGS_DLAT) location.txt
grep ^WGS_D?LAT location.txt
請問正確的圖案是什么?
uj5u.com熱心網友回復:
首先,您應該始終參考您的正則運算式以保護它們免受外殼程式的影響。例如,|在 shell 中具有特殊含義,它是管道運算子,它允許您將一個程式的輸出作為輸入傳遞給另一個程式。因此,未參考grep ^WGS_LAT|^WGS_DLAT location.txt的被解釋為“運行grep ^WGS_LAT并將其輸出作為輸入傳遞給^WGS_DLAT location.txt.
接下來,默認grep使用基本正則運算式,并且要獲得|to 的意思,或者您需要將其轉義為\|或使用-E(或-P標志,如果您使用的grep是啟用 PCRE 的 GNU)來啟用擴展的正則運算式。所以所有這些都應該適合你:
grep -E '^WGS_LAT|^WGS_DLAT' location.txt
grep -E '^(WGS_LAT|WGS_DLAT)' location.txt
grep '^WGS_LAT\|^WGS_DLAT' location.txt
或者,更簡單地說,grep 用于以WGS_和可選開頭的行,D后跟LAT:
grep -E '^WGS_D?LAT' location.txt
uj5u.com熱心網友回復:
Grep 可以處理兩種型別的正則運算式:
- 您呼叫的基本正則運算式 (BRE)
grep PATTERN file - 您呼叫的擴展正則運算式 (ERE)
grep -E PATTERN file
所以默認情況下 grep 使用 BRE。
閱讀您的手冊頁時,grep您會發現
基本正則運算式 vs 擴展正則運算式 在基本正則運算式中,元字符
?,,{,|,(, 和)失去了它們的特殊含義;而是使用反斜杠版本\?,\,\{,\|,\(, 和\).
所以,在你的情況下,答案是:
$ grep "^\(WGS_LAT\|WGS_DLAT \)" location.txt
$ grep -E "^(WGS_LAT|WGS_DLAT)" location.txt
$ grep "^WGS_D\?LAT" location.txt
$ grep -E "^WGS_D?LAT" location.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/511469.html
標籤:linux重击Unix
