2013-05-07 77 views
2

我想SERCH和替換使用的sed Cygwin中:Sed在Cygwin中搜索和替換語法?

SRC_FOLDER_MAIN=bra 
TGT_FOLDER_MAIN=tag 

,但下面的sed命令不起作用:

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' externals.txt > externals_mod.txt 

例如,這工程確定(取代「胸罩」與「標籤「):

sed 's/bra/tag/g' externals.txt > externals_mod.txt 

我錯過了什麼?

難道是Cygwin是問題嗎?

+3

+1您的例子,它也許一個錯字,但意義!與''相同,**'胸罩**必須**配對**也是^ _ ^。 – Kent 2013-05-07 11:32:41

+0

配對?我不明白...? – Danijel 2013-05-07 12:19:08

+0

這是一個非常困難的概念,需要多年的深入研究:P:P:P – abasu 2013-05-07 12:26:07

回答

2
如果你需要傳遞的SED shell變量

,你需要帶他們出去單引號 的嘗試這樣

sed 's/'${SRC_FOLDER_MAIN}'/'${TGT_FOLDER_MAIN}'/g' $externals.txt > $externals_mod.txt

通知'之前和之後${SRC_FOLDER_MAIN}和類似的${TGT_FOLDER_MAIN}

更新:示例

[[bash_prompt$]]$ cat log 
we will replace aaaa with bbbb 
[[bash_prompt$]]$ a=aaaa;b=bbbb 
[[bash_prompt$]]$ sed 's/'${a}'/'${b}'/g' log > new_log 
[[bash_prompt$]]$ cat new_log 
we will replace bbbb with bbbb 
+0

不,這不起作用。 – Danijel 2013-05-07 12:16:48

+0

我更新了一個工作示例 – abasu 2013-05-07 12:25:11

+0

好吧,所以這可能是我的cygwin安裝問題? – Danijel 2013-05-07 12:28:03

3

要使sed基於變量值進行替換,請用雙引號括起來並使用簡單變量調用,而不要使用{}。另外,$externals*.txt是否正確?如果你正在調用文件,只需輸入他們的名字。

sed "s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g" $externals.txt > $externals_mod.txt 

而不是

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' $externals.txt > $externals_mod.txt 
+0

雙引號不起作用:sed:-e表達式#1,字符17:未知選項's' – Danijel 2013-05-07 11:30:45

+0

Uhms我看到了,試着用'sed「s/$ SRC_FOLDER_MAIN/$ TGT_FOLDER_MAIN/g」$ externals。txt> $ externals_mod.txt'已更新。也就是說,沒有變量{}。 – fedorqui 2013-05-07 11:32:14

+0

再次錯誤:sed:-e表達式#1,字符17:未知選項到's' – Danijel 2013-05-07 11:33:20

0

如果你使用的sed將接受它的替代人物掙扎,只是用awk:

SRC_FOLDER_MAIN=bra 
TGT_FOLDER_MAIN=tag 

awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" '{gsub(src,tgt)}1' "$externals.txt" > "$externals_mod.txt" 

這將與任何字符工作變量。唯一需要注意的是,和sed一樣,「source」將被視爲正則表達式,因此RE元字符(例如「。」或「*」)將會有意義 - 如果這是一個問題,請告訴我們有一個簡單的awk解決方案,但沒有相應的sed解決方案。

awk的查找和替換字符串,而不是一個正則表達式:

awk -v src="$SRC_FOLDER_MAIN" -v tgt="$TGT_FOLDER_MAIN" ' 
    idx = index($0,src) { $0 = substr($0,1,idx-1) tgt substr($0,idx+length(src)) }1 
' "$externals.txt" > "$externals_mod.txt" 
1

您是否正在使用標準的Windows cmd shell?

如果是這樣,那麼你需要換環境變量%的跡象,像這樣:

sed 's/%SRC_FOLDER_MAIN%/%TGT_FOLDER_MAIN%/g' externals.txt > externals_mod.txt