Bash

轉義 [ 在 grep 中

  • April 28, 2017

我從標準輸入讀取字元串,我想顯示與字元串匹配的使用者。問題是,如果使用者輸入字元“[”或包含它的字元串。

grep -F不起作用,因為該行必須以字元串開頭(^ - 這是一個帶有 -F 的簡單字元)。另外,getent $user也不好,因為我也只需要使用者名而不是 id。

if [[ "$user" == *"["* ]]; then
   echo -e "Invalid username.\n"
   continue
fi

if ! getent passwd | grep "^$user:"; then
   echo -e "Invalid username.\n"
   continue
fi

這是’[‘的解決方法,還有其他方法嗎? awk最有可能完成這項工作,但我對此一無所知,我對 grep 感興趣。

要麼將其轉義,要麼將其放入字元類中,類似於以下內容:

grep '\['

grep '[[]'

grep -e "${user//\[/\\\[}"

我們使用 shell 變數中的語法${var//c/d}=>替換$var所有字元。現在,在您的情況下,is但它碰巧在這種語法中很特殊(它確實是萬用字元),因此我們需要通過在它前面加上反斜杠來轉義它,即.c``d``c``[``[``\[

現在來到替換部分,我們需要的是一個\[在那裡。但是同樣,在這種參數替換的語法中,兩者都是特殊的\,因此兩者都需要,是的,你猜對了,反斜杠導致表達式:: [``${var//...}``\\\[``"${var//\[/\\\[}"

高溫高壓

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