Cygwin中的Sed搜索和替换语法?
我正在尝试在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替换,请使用双引号将其括起来,并使用简单的变
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