Bash
-bash:使用前瞻和回溯時意外標記“(”附近的語法錯誤?
案例相當簡單。我有一個文本文件,名稱如下
eg.txt
:‘simple_example’: 345, ’to_demonstrate’: 232,
‘regex’: ‘不好用’
我正在嘗試擷取密鑰:
grep -oP (?<=')[a-zA-Z_0-9]+(?=':) eg.txt
它給了我錯誤:
-bash:意外標記 `(’ 附近的語法錯誤
轉義單引號也無濟於事:
grep -oP (?<=\')[a-zA-Z_0-9]+(?=\':) eg.txt
使用擴展的 grep 也沒有幫助:
grep -oE (?<=')[a-zA-Z_0-9]+(?=':) eg.txt
這裡發生了什麼?我正在使用帶有 Windows 10 WSL 的 linux bash。
錯誤消息解決的問題不是單引號而是括號。不帶引號的括號對 shell 來說是特殊的,它們的含義取決於它們在命令行中的位置。不帶引號的單引號和輸入重定向運算符
<
也會成為問題,因此最好引用整個正則表達式以防止 shell 將其解釋為 shell 語法:grep -P -o "(?<=')[a-zA-Z_0-9]+(?=':)" eg.txt
由於您的表達式包含單引號,而單引號字元串不能包含單引號,因此我使用雙引號來引用整個表達式。
如果您的輸入是格式良好的 JSON 文件(使用雙引號鍵和值),那麼使用 JSON 解析器從中獲取頂級鍵會更容易,例如
jq
:$ cat file { "simple_example": 345, "to_demonstrate": 232, "regex": "is not easy to use" }
$ jq -r 'keys[]' file regex simple_example to_demonstrate
這會將頂級鍵提取到一個數組中(with
keys
),然後將該數組擴展為一個集合(with[]
),然後將其解碼輸出(即作為“原始”字元串而不是編碼的 JSON 字元串,由於-r
)。