作者 主題: 正規表示法疑惑  (閱讀 5322 次)

0 會員 與 1 訪客 正在閱讀本文。

apachectl

  • 憂鬱的高中生
  • ***
  • 文章數: 174
    • 檢視個人資料
正規表示法疑惑
« 於: 2004-11-15 14:41 »
容我偷懶一下:
http://home.kimo.com.tw/pachingkolpi/lesson2.htm#w

紅字部分寫到使用雙引號時若包含 " $ " ,則其本身的特殊意義並不會改變。
我想要用實做去證明,但想不到要怎麼做?大大可以教一下嗎,謝謝!

polinewu

  • 可愛的小學生
  • *
  • 文章數: 26
    • 檢視個人資料
正規表示法疑惑
« 回覆 #1 於: 2004-11-15 21:11 »
#var=root
#grep "$var" /etc/passwd
這樣會把檔案中含有 root 的那幾行列出來.

# grep '$var' /etc/passwd
這樣會把檔案中含有 $var 的那幾行列出來,這時候當然會找不到.

# grep 'var$' /etc/passwd
這樣會把檔案中結尾是var 的那幾行列出.用雙引號一樣

不過以上都還沒做,linux 主機沒開,等晚一點再試看看。
如有錯誤請糾正。

polinewu

  • 可愛的小學生
  • *
  • 文章數: 26
    • 檢視個人資料
正規表示法疑惑
« 回覆 #2 於: 2004-11-16 16:47 »
我做出來了,跟我之前寫的一樣,就是這樣.yes>

funlonkon

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
正規表示法疑惑
« 回覆 #3 於: 2004-11-16 22:57 »
以前從來沒注意到 RE 這方面的用法,真的是太神奇了。又多學了一招。

apachectl

  • 憂鬱的高中生
  • ***
  • 文章數: 174
    • 檢視個人資料
正規表示法疑惑
« 回覆 #4 於: 2004-11-17 12:03 »
我了解了,謝謝。
不過很想知道各位大大平常使用 RE 時都習慣用單引號還雙引號還是都不用?
像我平常都用雙引號居多。

polinewu

  • 可愛的小學生
  • *
  • 文章數: 26
    • 檢視個人資料
正規表示法疑惑
« 回覆 #5 於: 2004-11-17 23:47 »
我又發現了一點,若在雙引號或單引號裡面用跳脫符號 \,所得到的效果不一樣,
比如
#grep "bash\$" /etc/passwd
# grep 'bash\$' /etc/passwd
單引號裡面可以跳脫,但雙引號裡面不行。

powerouch

  • 活潑的大學生
  • ***
  • 文章數: 234
    • 檢視個人資料
    • http://itmania.javamoh.net/s9y/
正規表示法疑惑
« 回覆 #6 於: 2004-11-18 13:49 »
那是因為 shell 本身對單引號和雙引號的解譯不同
單引號不接受 interpolation,在單引號中只有單引號需要 escape
雙引號則否

你說的不行是因為你只傳了一個$給grep
要(在雙引號裡) escape 必須用 "bash\\\$" 才行
try it!
'm no more than a fxxking coding monkey....

polinewu

  • 可愛的小學生
  • *
  • 文章數: 26
    • 檢視個人資料
正規表示法疑惑
« 回覆 #7 於: 2004-11-18 15:40 »
我已經被搞得暈頭轉向了,看來還是按照正常來使用好了,沒想到一個 grep 的
學問這樣大啊。

powerouch

  • 活潑的大學生
  • ***
  • 文章數: 234
    • 檢視個人資料
    • http://itmania.javamoh.net/s9y/
正規表示法疑惑
« 回覆 #8 於: 2004-11-18 15:51 »
簡單來說,你可以試試看
% grep "bash\\\$" /etc/passwd

% grep 'bash\$' /etc/passwd
是不是會跑一樣的結果
'm no more than a fxxking coding monkey....

Sandro Chen

  • 懷疑的國中生
  • **
  • 文章數: 62
    • 檢視個人資料
正規表示法疑惑
« 回覆 #9 於: 2004-11-24 16:22 »
引述: "apachectl"
我了解了,謝謝。
不過很想知道各位大大平常使用 RE 時都習慣用單引號還雙引號還是都不用?
像我平常都用雙引號居多。


先建立一個小觀念
UNIX 上的 shell 本身都是一個直譯器
也就是說, 你在 shell command line 輸入的任何字, shell 都會先幫你翻譯處理
什麼是直譯器, 簡單說就是一個即時翻譯的程式語言!!
所以當你使用 UNIX command line 一段時間之後, 你就可以試著去思考
你所輸入的command, 會被 UNIX shell 翻譯成什麼樣子
一般初學者最常搞混的就是 $$ dollar sign 嚕...

如果各位手邊有UNIX shell 的話, 可以試著輸入
echo $HOME <ENTER>

echo '$HOME' <ENTER>
然後再輸入
echo "$HOME" <ENTER>
有沒有發現, 第一個和第三個的結果是一樣的...
如果不一樣的話, 那請告訴我您的 shell version, 因為我脫離 UNIX 太久, 退流行嚕...
所以最簡單的辨別 " double quote 和 ' quote 用途差異的部份, 就在於
"" double quote 所包含的字串同樣會被 shell 這個編譯器給翻譯掉了
'' quote 所包含的字串則不會...

所以當你輸入
grep '$400' test.txt
grep 這個UNIX 命令執行的時候, grep 所看到的第一個命令列參數是 $400
若你輸入
grep "$400" test.txt
則 shell 看到 double quote 裡面包了個 $ 錢字號, shell 會先幫你翻譯
找看看有沒有變數叫做 400 的, 如果有的話, "$400" 就會被翻譯成那個變數值內容, 如果沒有定義 400 這個變數的話, shell 幫你翻譯的結果就變成空字串..也就是
grep 真的在執行的時候看到的第一個參數已經經過 shell 翻譯過嚕~~
該變數是有定義的變數 grep 看到的就是變數內容
該變數未經定義, grep 看到的就是空字串

如果上面的部份, 各位看了沒問題的話...那我們再來看
"" 作啥用的..
請各位先問自己一個小問題..
UNIX 的 shell 上都會有所謂的 command line argument
那每一個 command line argument 的 seperater (她的分隔依據)是啥?
如果您用的是 ksh, bash, csh, tcsh , etc...
那應該會和小弟的心得是相同的...
因為她就是這個程式語言編譯器用來識別變數和非變數的依據...
她的分隔符號是 空白, 也就是在 command line 所輸入的字串裡面
每一個 command line argument 都是被空白格開的...
如果大家對上面這一小段話沒啥太大的意見的話,那就接著往下看嚕
因為UNIX 的習慣上, 都是以空白當做命令列參數的區隔的...
所以當你需要在同一個命令列參數中包含一個或多個空白的時候..
你就必須用到 "" double quote 了


所以如果你趕時間, 不想記那一堆廢話的話...
簡單說, 結論就是
1.當你不想你的字串被 shell 這個翻譯器翻譯的話, 就請用 'OOXX' quote
example :
echo '$400 dollar'
grep '$400 dollar' test.txt

2.當你的一個命令列參數 command line argument 必須包含空白時, 就請用 "OOXX" double quote
example :
比如說我要在文字檔中搜尋同樣金額但是不同幣值的字串
我就可以設定一個變數, 叫做 volumn
然後, 我在搜尋的時候, 在指定我要搜尋的是美金, 或新台幣嚕
volumn=300;export volumn
搜尋美金 : grep "$volumn US dollar" test.txt
搜尋新台幣 : grep "$volumn NT" test.txt

--
最後補充一下, 基本上 quote 和 double quote 應該不算是 RE 的範疇的東西喔
因為它應該是屬於 shell 解譯的觀念
hink Do, I Will
思考 行動, 我將能夠
Sandro Chen

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17466
    • 檢視個人資料
    • http://www.study-area.org
正規表示法疑惑
« 回覆 #10 於: 2004-11-24 23:10 »
有空的話, 看一下我的 shell 十三問,
若看得懂, 那你的問題都可自己解答:
http://www.chinaunix.net/forum/viewtopic.php?t=218853
因為放在大陸的網站, 速度可能慢點...