作者 主題: 請教一個sed處理取代字串中含特殊字元的問題  (閱讀 8424 次)

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

dody520

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
我想將檔案中的文字 $abc 取代成 //$abc

在linux comand下:可以寫成: sed –I ‘s/$abc /\/\/$abc /g’ filename

可是放到script內,執行結果就不一樣,請問有方法嗎?

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
你 script 怎麼寫的?

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
sed -i 's/\$abc /\/\/\$abc /g' filename

這樣呢?

dody520

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
你 script 怎麼寫的?
就空白,只一行

sed -i 's/\$abc /\/\/\$abc /g' filename

這樣呢?
還是不行...

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
我這邊測試的結果:

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
-i 要小寫的 i,單引號雙引號結果也不同,filename確定path可找到,權限寫入沒問題,
也可以先把 -i 拿掉,看看有沒有出現什麼…

dody520

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
抱歉!
應該說明我把它寫成makefile,執行結果如圖,怪怪的
第一張是filename檔案內容
第二張是makefile內容
第三張是執行結果

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
$a的值在makefile中是空的,所以變成
sed -i 's/bc/\/\/  bc/g' filename
所以結果很合理,電腦沒有跑錯。

dody520

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
$a的值在makefile中是空的,所以變成
sed -i 's/bc/\/\/  bc/g' filename
所以結果很合理,電腦沒有跑錯。

嗯對腦不會錯
請問:
1. 電腦為什麼會把$a視為一個變數,而不會把$abc視為一個變數?
2. 用單引號',為什麼$a還會視為一個變數?而不是字串?
« 上次編輯: 2013-03-13 19:25 由 dody520 »

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
因為它是「Makefile」是由make去呼叫解讀的,不是bash,
make會先解讀一次,再交給shell去解讀,
要先寫Makefile語法,用$$來代替$,然後還要再想一次,
make解讀完後,是shell看得懂的方式,腦中要先解讀兩層,才不會寫錯。

還有一個方法,把sed那行另寫一隻程式,Makefile再去呼叫那隻程式,就不會有轉好幾層的問題。

dody520

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
解釋很詳盡
感謝~~~