我正在尝试使用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可能是问题吗?
答案 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"