Bash

-bash:使用前瞻和回溯時意外標記“(”附近的語法錯誤?

  • May 18, 2022

案例相當簡單。我有一個文本文件,名稱如下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)。

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