bat SET中替换字符串(用变量代表需替换的字符串)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bat SET中替换字符串(用变量代表需替换的字符串)相关的知识,希望对你有一定的参考价值。

@ECHO OFF SET "VAR=ab,dc,cc,ef,gg,AQ,gg" SET "VAR=%VAR:,= %" ECHO %VAR% SET "MAT=gg" ECHO %MAT% SET "VAR=%VAR:%%MAT%= %" REM 执行到这一句是有问题的
一般情况下 直接 SET "VAR=%VAR:gg= %" 这样就可以了

但是 我想要用MAT来代表gg的话 ,又该怎么写SET?
求解答 谢谢
最后一句是有问题的 不想%VAR:gg= % 要用变量的形式,怎么解决

@ECHO OFF
SET "VAR=ab,dc,cc,ef,gg,AQ,gg"
SET "VAR=%VAR:,= %"
ECHO %VAR%
SET "MAT=gg"
ECHO %MAT%
call SET "VAR=%%VAR:%MAT%= %%"
ECHO %VAR%

call命令会对其参数进行扩展,然后再执行,gg会替换成一个空格

也可以启用变量延迟来实现@echo off&setlocal enabledelayedexpansion.........set "var=!var:%mat%=!

追问

FOR  循环中 有没有办法让 (!strTmp7!)  每次循环的时候,可以改变


比如(strTmp=aa  bb  cc  dd aa )

  第一次循环之后,取到aa   想把strTmp=bb cc dd  这样循环   不想取到重复的


或者执行所有的循环之后,把重复的结果去掉保存在str中

参考技术A @ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION
SET VAR=ab,dc,cc,ef,gg,AQ,gg 
SET VAR=%VAR:,= % 
ECHO %VAR% 
SET MAT=gg
ECHO %MAT% 
SET VAR=!VAR:%MAT%= ! 
ECHO %VAR%
pause

启用批处理中的延迟变量扩展就可以轻松处理了.

追问

FOR  循环中 有没有办法让 (!strTmp7!)  每次循环的时候,可以改变


比如(strTmp=aa  bb  cc  dd aa )

  第一次循环之后,取到aa   想把strTmp=bb cc dd  这样循环   不想取到重复的


或者执行所有的循环之后,把重复的结果去掉保存在str中

Sed 删除匹配行,匹配的字符用Shell变量替换,且变量里含有斜杠“/”时,无法删除

~$ cat hello
/usr/local/bin/
~$ name=/usr/local/bin/
~$ sed -i "/$name/d" ./hello
sed: -e expression #1, char 3: unknown command: `u' (命令报错)
~$ sed -i "#$name#d" ./hello (修改语法,用# 代替/)
~$ cat hello
/usr/local/bin/ (仍然没有删除掉)

请问哪位大侠有解决办法

“修改语法,用#代替”,这个只能用在sed的s替换命令中,如:s/A/B/可以写为s#A#B#

但直接正则匹配 /正则/ 是不可以这样用#替代的。

这里提供两个方法供参考:

1)先用s命令将此要删除的路径替换为一个文件中不可能出现的唯一字符串,然后再通过正则匹配该字符串删除该行。可以写在一条sed语句中。

name=/usr/local/bin/
sed -i 's#'$name'#EXCLUSIVE#;/EXCLUSIVE/d' hello

2) grep也支持正则,可以使用grep -v反向过滤。

name=/usr/local/bin/
grep -v "$name" hello >output
mv output hello

追问

非常感谢您的提示,完美的答案。 在这里我再追问一下,为什么'$name'要用单引号, 果然我试了一下换成双引号或者什么也不加的情况下,不能完成删除。但是据我所知道的,一般Shell变量在语句中出现,都是以双引号扩起来的。这次是为什么呢?

追答

其实不是$name要加单引号,而只是用于结束前面的单引号,和再开始后面的单引号,从而将$name置入单引号外面的shell环境中,才能得到shell解析。单引号内为sed环境。

参考技术A 给你个例子:

kshlee> echo "/usr/local/bin" | sed "s|/|#|g"
#usr#local#bin

注解:sed不必一定要用 / 来分隔,你的case,要代替的字符里有 / 所以用 | 来分隔,只要你的字串里没有‘|’,那麼这个sed就会成功。追问

在's'替换的情况下,可以用别的字符代替,但是在'd'删除的请况下,好像就不行了。
我是想做这个删除操作:
~$ name=/usr/local/bin/
~$ sed -i "/$name/d" ./hello

追答

你如果只是想把 /usr/local/bin 这部分从整行中删除掉,那麼可以用‘s'来substitute with nothing,例如:

echo "a b c /usr/local/bin d e f" | sed "s|/usr/local/bin||"
a b c d e f

要是你要把整行去掉,只要这一行中有/usr/local/bin这个pattern,那麼建议你用xiehuahere的
grep -v command

追问

    是的,我需要把正行去掉。 xiehuahere的第一种方法也不错, 第二种方法要多建一个文件,感觉还是第一种方法更直接一些。 同样感谢您的解答

参考技术B sed -i "/[$name]/d" hello

以上是关于bat SET中替换字符串(用变量代表需替换的字符串)的主要内容,如果未能解决你的问题,请参考以下文章

球批处理bat程序实现替换文本中自定字符串

bat批量重命名(指定替换字符)

Bat 替换文件中的字符串

bat替换文本字符串!

BAT:文件中替换字符(保留空格和换行)

如何用BAT替换文本的字符串?