我有一条线
Removing,policy,NULL,from,group,NULL
我想在第一个NULL处插入abc,在第二个NULL处插入xyz。 我从早上开始敲打我的脑袋,但仍无法弄清楚该怎么做。有人可以建议吗?
答案 0 :(得分:1)
我不知道如何获取该行,所以我将直接使用它:
setlocal enableDelayedExpansion
set "line=Removing,policy,NULL,from,group,NULL"
for /f "tokens=1-6 delims=," %%a in ("%line%") do (
set "new_line=%%a,%%b,abc,%%d,%%e,xyz"
)
echo !new_line!
如果在另一个FOR
循环中进行此操作,您将需要延迟扩展,因为我怀疑是这种情况。
答案 1 :(得分:1)
如果您可以控制占位符的格式,那么我建议使用延迟扩展变量。然后,您可以使用FOR / F循环进行替换,因为在FOR变量扩展之后会发生延迟扩展。
@echo off
setlocal enableDelayedExpansion
:: Define the line with variable place holders
:: Quoted ! literal must be escaped as ^! when delayed expansion is enabled
set "var=Removing,policy,^!val1^!,from,group,^!val2^!"
:: Show the starting value
echo var=!var!
:: Define the replacement values
set "val1=abc"
set "val2=xyz"
:: Perform the substitution
for /f "delims=" %%A in ("!var!") do set "var=%%A"
:: Show the result
echo var=!var!
我使用延迟扩展将值转移到FOR变量而不是仅使用%var%
而不使用FOR的原因是为了处理|
,<
等毒字符的可能性在文本中,可能有或没有引号。延迟扩展和FOR变量使得我不必担心转义或引用内容。唯一的两个例外是可能存在的^
和!
文字。保留它们的最简单方法是将它们编码为延迟扩展变量。
答案 2 :(得分:0)
此方法假定之前不知道要在输入行中替换的值的格式/位置:
@echo off
setlocal EnableDelayedExpansion
rem Define the replacement values
set insert[1]=abc
set insert[2]=xyz
set "line=Removing,policy,NULL,from,group,NULL"
echo Before: %line%
set i=0
set "out="
for %%a in (%line%) do (
if %%a equ NULL (
set /A i+=1
for %%i in (!i!) do set "out=!out!,!insert[%%i]!"
) else (
set "out=!out!,%%a"
)
)
set "line=%out:~1%"
echo After: %line%
如果在FOR循环内生成该行,只需通过for %%a in (!line!) do (
命令中的延迟扩展来扩展它。