2016年3月9日 星期三

Bash 筆記 - 變數的字串取代方法(餵給 sed 關鍵字的前置處理)

這個需求是這樣的,想要用 sed 來取代檔案中的資料,但用 sed 查詢資料時,又需要處理 pattern 字串,例如想把檔案內所有 "http://127.0.0.1:8000" 的關鍵都取代成 "/"

這時用 sed 的指令就變成 sed 's/http:\/\/127\.0\.0\.1:8000/\//' filename,變得有點不方便,所以就想到有沒有在餵給 sed 指令前,把字串處理一下來避開 sed regular expression 的用法,找了一下,頗方便:

#!/bin/bash

keyword=$1

keyword =${keyword//\//\\\/};
keyword =${keyword//-/\\-};
keyword =${keyword//\./\\.};

cmd="sed 's/$keyword/\//' filename"

echo $cmd
eval $cmd


其中 Bash 裡的字串,要做取代的方式:

#只處理一次取代
keyword=${keyword/OldPattern/NewPattern}

#處理全部處代
keyword=${keyword//OldPattern/NewPattern}


收工!

3 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
    回覆
    1. 更新一下,如果只想換 s 指令的分隔符號,那改成 "s,……,……," 就行了。 (也可以換成其它字元。)

      刪除
    2. 讚讚 XD 我 command line 太弱了

      刪除