Cygwin中的Sed搜索和替换语法?

Cygwin中的Sed搜索和替换语法?,sed,cygwin,Sed,Cygwin,我正在尝试在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”): 我错过了什么 是否Cygwin是问题所在?要基于变量值进行sed替换,请使用双引号将其括起来,并使用简单的变

我正在尝试在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”):

我错过了什么


是否Cygwin是问题所在?

要基于变量值进行
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

如果您正在努力解决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一样,“源”将被视为regexp,因此RE元字符(例如“.”或“*”)将是有意义的-如果这是一个问题,请告诉我们,因为存在一个简单的awk解决方案,但没有等效的sed解决方案

用于查找和替换字符串而不是regexp的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"

如果需要在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

您正在使用标准的Windows cmd shell吗

如果是这样,则需要将环境变量用%符号包装,如下所示:

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

双引号无效:sed:-e expression#1,char 17:s'Uhms的未知选项我看到了,请尝试更新后的
sed“s/$SRC_FOLDER_MAIN/$TGT_FOLDER_MAIN/g”$externals.txt>$externals_mod.txt
。也就是说,没有变量的
{}
。再次出现错误:sed:-e expression#1,char 17:unknown选项“s”发布您正在使用的确切命令。我没有添加任何
-e
-s
。这可能很重要,我不知道。检查
man sed
以查看是否可以找到一些提示。我达到了我的极限:)+1对于你的例子,它可能是一个打字错误,但有意义!与
相同,
bra
也必须配对。配对?我不明白…?这是一个非常困难的概念,需要多年的深入研究:P:P:Pah好的,我明白了。。。我们将开始谈正事。。。。。。。如果你没有得到它,就忘了它吧……也许,在那种情况下,我不是合适的人。最好把cygwin也加在你的问号上
sed 's/%SRC_FOLDER_MAIN%/%TGT_FOLDER_MAIN%/g' externals.txt > externals_mod.txt