簡體   English   中英

grep命令中“ $ a $”的特殊含義

[英]Special meaning of “$a$” in grep command

我正在嘗試學習Shell腳本,並且正在嘗試不同的方法。 在練習時,我遇到了grep "$a$" file1並且無法理解輸出。

我知道單引號采用字面意思的區別,而雙引號則試圖找到特殊含義,例如$a應該是變量$

我有內容file1

#!/bin/sh
a=1
b=1
echo $a
echo $b
for I in 1 2 3 4 5 6 7 8
do
    c=a
    b=$a
    b=$(($a+$c))
    echo $b
done

grep "$a$" file1給了我整個file1作為輸出,而grep '$a$' file1給了我應有的輸出,就像以$a結尾的行一樣。

請解釋為什么使用grep "$a$"時,它將整個文件內容作為輸出輸出。

沒有特別的意義。

我在您的代碼中看不到任何grep 我假設您是從命令行grepping的,並且變量a是未定義的。 因此, grep "$a$"擴展為grep "$"$a擴展為空),並且grep $匹配每行,因為$匹配行尾。

[更新]“擴展”是指shell變量擴展。 由於$a在雙引號之間,因此外殼程序將$a替換$a變量a (未定義)的值。 您的grep '$a$'產生預期的結果,因為單引號之間的任何字符串始終不會被外殼覆蓋。 試試echo "$a$"echo '$a$'

以grep模式中的^$開頭分別表示開始和結束。

grep "$a$" file1

$a進行擴展,因為它在雙引號內。 在您的情況下, $a應該是未定義的。 因此, "$a$"的結果是$ ,它與每一行的末尾匹配,因此您將獲得整個文件作為輸出。 要驗證這一點,請為a分配一些測試值,然后運行grep。

a="TestValue" # Before running grep
grep "$a$" file1

我敢打賭,您將一無所獲。

現在,如果您想在雙引號中包含一個文字“ $”。 那你需要做

grep "\$a$" file1 # See the first $ is escaped

上面的命令將為您提供所有以$a結尾的行

echo $a
b=$a

現在,如果您厭倦了轉義,可以使用如下單引號

grep '$a$' file1
# The first $ is literal $, and the last one symbolizes end of file.
# More over variable-expansion doesn't take place inside single quotes.

注意: file1內的a=1對grep結果沒有影響,因為file1只是grep的輸入。

"$a$"

字符串"$a$"被擴展為$a shell變量的值,后跟文字$ (為什么?請參見下文)。 如果未設置$a變量,則其值將解釋為空字符串,並且擴展結果為"$" (僅美元符號)。

為什么最后一個美元符號沒有擴展?**

參數擴展的基本形式是"${PARAMETER}" 括號不是必需的,如果PARAMETER是不與多於一個的位(位置參數1011等),並且如果PARAMETER不跟一個字符不被解釋為它的名稱的一部分。 由於$開始下一個參數擴展,命令替換,算術擴展,它不被解釋為一個部分a參數的名字在我們的案例。

由於最后一個$后面沒有任何內容,因此它不符合任何擴展形式,並且保持不變。

Grep如何解釋模式

由於匹配行結束符$ )在字符串末尾或換行符之前匹配空字符串,因此模式$匹配任何line

因此,如果$a為空,則grep "$a$" file將匹配並打印file所有行。

'$a$'

單引號可以防止字符串擴展(特殊字符的解釋)。 即,字符串按原樣傳遞給命令。

對於grep '$a$' file調用,該模式與該行末尾的 "$a"字符串匹配。 下面說明原因。

我們知道,最后的$表示行的結尾。 其余美元符號將根據模式進行解釋。 可以將其解釋為原義的美元符號或行尾。

在以下情況下, $表示行尾運算符。 否則, $是普通的。

  • 如果$在模式中位於最后,如foo$
  • 語法RE_CONTEXT_INDEP_ANCHORS被置位,並且在方括號表達式之外。
  • 它結束一個開放組或交替運算符表達式,例如'\\(b$\\)''\\(b$\\)\\|a'

以來

  • 我們模式中的第一個$顯然不是最后一個,
  • 您正在使用基本的RE_SYNTAX_GREP 語法 ,即BRE,
  • 並且不使用開放組/替代,

第一個美元符號在$a$普通 $a$

什么時候第一個$普通

例如,在擴展正則表達式的情況下,這是不尋常的。 也就是說,例如,使用-E-P選項,或者使用egreppgrep命令(其中RE_CONTEXT_INDEP_ANCHORS語法位置1)。

轉義美元符號

即使在基本正則表達式中將美元符號解釋為文字$ ,也應考慮轉義美元符號。 這會養成一個好習慣。

要在單引號內轉義美元符號,請使用反斜杠: '\\$a$'

在雙引號中,反斜杠具有特殊含義,因此您需要轉義反斜杠本身: "\\\\\\$a\\$"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM