在Cygwin中搜索和替换语法?

时间:2013-05-07 11:27:12

标签: sed cygwin

我正在尝试使用Cygwin中的sed进行serch和替换:

SRC_FOLDER_MAIN=bra
TGT_FOLDER_MAIN=tag

但是以下sed命令不起作用:

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

例如,这可以正常工作(将“bra”替换为“tag”):

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

我错过了什么?

Cygwin可能是问题吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

您使用的是标准Windows cmd shell吗?

如果是这样,那么你需要将环境变量包装在%符号中,如下所示:

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

答案 3 :(得分: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”将被视为regexp,因此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"