2

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

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

4 回答 4

3

To make sed replace based on variables value, wrap it with double quotes and use simple variable calling, without {}. Also, is $externals*.txt correct? If you are calling files, just put their name.

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

Instead of

sed 's/${SRC_FOLDER_MAIN}/${TGT_FOLDER_MAIN}/g' $externals.txt > $externals_mod.txt
于 2013-05-07T11:28:02.730 回答
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
于 2013-05-07T11:56:52.717 回答
1

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

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

sed 's/%SRC_FOLDER_MAIN%/%TGT_FOLDER_MAIN%/g' externals.txt > externals_mod.txt
于 2014-12-16T04:30:48.417 回答
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 一样,“源”将被视为正则表达式,因此 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"
于 2013-05-07T11:41:07.187 回答