作者 主題: 正規表示式中如何帶入變數?  (閱讀 9074 次)

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

bbbnice

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
正規表示式中如何帶入變數?
« 於: 2002-09-12 13:46 »
各位大大您好!小弟在寫一個小小shell scrip,小弟希望能用正規式搜尋一變數,如:
for i in `cat /home/test.txt`
do
         sed -n '/$i/p'  /home/file > /home/file1(此種寫法絕對錯)
done
小弟的疑問是,$在常規式中表示結尾,加\在$前的話,又變成單純的字元,而非變數開頭,
到底要如何才能帶變數到常規式中呢?

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
Re: 正規表示式中如何帶入變數?
« 回覆 #1 於: 2002-09-12 14:06 »
將單引號 '$i' 改為雙引號 "$i" 。

不妨了解一下 hard quote 和 soft quote 的差異。

bbbnice

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
正規表示式中如何帶入變數?
« 回覆 #2 於: 2002-09-12 14:30 »
感謝netman!是小弟誤會了,小弟一直以為sed的用法是sed '  ' filename,以為只能用單引號而已,真是抱歉!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
正規表示式中如何帶入變數?
« 回覆 #3 於: 2002-09-12 14:57 »
嗯,這也是許多 shell 初學者很不容易理解的部份。

因為 sed 在處理 parameter 的時侯,某些特定字元(如 / 符號),是有特定意義的。但 sed 的 parameter 是 user 透過 command line (也就是 shell ) 傳給它的。問題是:某些字符對 shell 來說也有特別意義。

這時後,就須要在 shell 那層將那些字元包留(或曰"跳脫",escape )下來,再 pass 給 sed 。要進行跳脫的方法常有兩種:
* escape charactor (\)
* quoting

比方要將 "$" (符號本身)跳脫,則寫 "\$" ﹔要將 "." 跳脫,則 "\." ,否則,在 RE 中,"." 是表示任意單一字元。如此類推...

而 quoting 則分兩種:
* hard quote (單印號)
* soft quote (雙引號)
兩者都可以用來做跳脫,但 soft quote 中會不跳脫某些字符,例如 "$" 符號﹔但 hard quote 則不管三七二十一,全部跳脫!

因此:
* '$i' 就是一個 $ 符號後接一個 i
* "$i" 則是 i 這個 variable 的值(value)

理解?

若然,請回答下面有何不同:
* '"$i"'  (單引號在外)
* "'$i'"(雙引號在外)

tony

  • 活潑的大學生
  • ***
  • 文章數: 204
    • 檢視個人資料
正規表示式中如何帶入變數?
« 回覆 #4 於: 2002-09-12 20:05 »
==hard quote 則不管三七二十一,全部跳脫! ==

所以(單引號在外) '"$i"'="$i"(是符號啦)

而雙引號在外"'$i'"='則是 i 的值'=>$i的值外面再加上單引號啦
-=-=-=
Powered by Linux
=-=-=-=-=-=-=-=-=

bbbnice

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
正規表示式中如何帶入變數?
« 回覆 #5 於: 2002-09-13 10:26 »
再次感謝netman,單雙引號的使用法小弟了解了,但若遇到單雙引號衝突時怎麼辦?如:
for i in `cat /home/test.txt`
do
     sed "s/$i/\n$i/g" /home/test1.txt (將變數前增加一換行字元,但此寫法一定不正確)
done

 "s/$i/'\n'$i/g"會呈現'n'及i的value
若"'s/$i/\n$i/g'"(雙引號在外,單引號在內),不符合sed規則

echo可使用-e使在雙引號中的換行字元發揮作用,但sed好像沒有

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
正規表示式中如何帶入變數?
« 回覆 #6 於: 2002-09-13 10:36 »
下面的就好:

"s/$i/n$i/g"

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
正規表示式中如何帶入變數?
« 回覆 #7 於: 2002-09-13 10:39 »
同時使用雙引號和單引號並不會造成衝突:

* 若是單引號在外,裡面的雙引號只是符號,不是 soft quote 。
* 若是雙引號在外,裡面的單引號只是符號,不是 hard quote 。

bbbnice

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
正規表示式中如何帶入變數?
« 回覆 #8 於: 2002-09-13 11:05 »
如果照您所說的話,不是也只能在想要更換的變數前加上n,而不是一換行字元嗎?!
小弟做了後,出來的是
n及變數i的value
並不是
(空                                                                      行)
變數i的value

此部份小弟不是很了解

bbbnice

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
正規表示式中如何帶入變數?
« 回覆 #9 於: 2002-09-13 11:28 »
看來又要跟您說抱歉!sed似乎本來就沒辦法處理\n換行字元或\t 字元,使用sed好像受限蠻多的!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
正規表示式中如何帶入變數?
« 回覆 #10 於: 2002-09-13 11:30 »
原來要換行! 我以為你要跳脫 n 呢~~~ ^_^
sed "s/$i/\\
> $i/"

注意: 第一行在敲 enter 之前有兩條斜線。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17423
    • 檢視個人資料
    • http://www.study-area.org
正規表示式中如何帶入變數?
« 回覆 #11 於: 2002-09-13 11:37 »
引述: "bbbnice"
看來又要跟您說抱歉!sed似乎本來就沒辦法處理\n換行字元或\t 字元,使用sed好像受限蠻多的!



可以吧?下結論前請先確定您對所下定論的對象夠了解。

比方我不知到  \n \r 如何在 sed 中處理。我最多最多最多最多最多說我不會。但我絕對絕對絕對絕對絕對不會說 sed 做不到...

bbbnice

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
正規表示式中如何帶入變數?
« 回覆 #12 於: 2002-09-13 13:40 »
謝謝netman,小弟謹記在心!