Batch file 使用批处理提取引号之间的字符串

Batch file 使用批处理提取引号之间的字符串,batch-file,Batch File,我有“input.txt”,我想搜索一个字符串并在引号之间提取一个字符串 my input.txt只有两行: name=' james carter' nationality = ' usa ' age=32 name='fabio rossi' nationality = ' italia - milano ' age=19 我希望批处理从引号中提取名称(带空格),并将它们放入变量中(在这种情况下,只需要两个变量)。例如,我想设置两个变量: name= james carter

我有“input.txt”,我想搜索一个字符串并在引号之间提取一个字符串 my input.txt只有两行:

name=' james carter'  nationality = ' usa '  age=32
name='fabio    rossi'  nationality = ' italia - milano '  age=19
我希望批处理从引号中提取名称(带空格),并将它们放入变量中(在这种情况下,只需要两个变量)。例如,我想设置两个变量:

name= james carter
name=fabio    rossi
所以我可以批量使用这些变量来做一些未来的操作

注:如有必要,可以使用sed

编辑

这似乎是不可能的,所以我想知道是否可以像这样用保留引号的字符串

name1=' james carter'
name2='fabio    rossi'
因此,现在的问题是,要在
name='
之后开始,然后以
'
结束,您可以尝试以下方法:

@echo off
setlocal enabledelayedexpansion
set "INPUT_FILE=input.txt"
set "SED_CMD=sed "s/name='\(.[^^']*\)'.*/\1/""
set i=0
for /f "usebackq tokens=*" %%a in (`findstr "name=" %INPUT_FILE%`) do (
    set /a i+=1
    for /f "usebackq tokens=*" %%v in (`echo %%a ^| %SED_CMD%`) do (
        echo %%v
    )
)
然后,您将拥有所需值的枚举变量(
name1
name2
)等。
请注意,这适用于具有指定表单的任何行(即
name='something'等等

编辑:修改代码以丢弃不包含字符串的行
name=

您可以尝试以下操作:

@echo off
setlocal enabledelayedexpansion
set "INPUT_FILE=input.txt"
set "SED_CMD=sed "s/name='\(.[^^']*\)'.*/\1/""
set i=0
for /f "usebackq tokens=*" %%a in (`findstr "name=" %INPUT_FILE%`) do (
    set /a i+=1
    for /f "usebackq tokens=*" %%v in (`echo %%a ^| %SED_CMD%`) do (
        echo %%v
    )
)
然后,您将拥有所需值的枚举变量(
name1
name2
)等。
请注意,这适用于具有指定表单的任何行(即
name='something'等等


编辑:修改代码以丢弃不包含字符串的行
name=

如果感兴趣的每一行的格式始终相同,从
name='
开始,则本机批处理解决方案很简单:

@echo off
setlocal
set input="test.txt"
for /f "tokens=1,3 delims=:'" %%A in (
  'findstr /b /c:"name='" %input% ^| findstr /n "^"'
) do set "name%%A=%%B"

此解决方案假定名称值从不包含
字符。

如果感兴趣的每一行的格式始终相同,从
名称='
开始,则本机批处理解决方案很简单:

@echo off
setlocal
set input="test.txt"
for /f "tokens=1,3 delims=:'" %%A in (
  'findstr /b /c:"name='" %input% ^| findstr /n "^"'
) do set "name%%A=%%B"

此解决方案假定名称值从不包含
字符。

您尝试了什么?您的代码在哪里失败了?问题是,如果我从输入中删除引号,那么只需要james放弃carter,因为空格,即使存在以空格开头的问题,所以我决定将名称放在单引号之间(我没有使用“”,因为它似乎会对批处理文件产生问题)但是现在我不知道如何提取它们之间的内容,也尝试使用sed,但是sed不是逐行处理所有文件的问题您尝试了什么?您的代码在哪里失败了?问题是,如果我从输入中删除引号,那么只需要james放弃carter,因为空格,即使存在以空格开头的问题,所以我决定将名称放在单引号之间(我没有使用“”,因为它似乎会对批处理文件产生问题)但是现在我不知道如何提取它们之间的内容,也尝试了sed,但是sed不是逐行处理所有文件的问题,同样的问题可以只用grep解决吗?有没有一个表达式可以找到name='bal bla'并去掉bla bla?@Leo92是的,但你也可以使用dbenham的解决方案,它根本不使用Sed或grep。是的,但这不是我的观点,我想提高我的grep技能,所以请教我如何只用grep来解决同样的问题吗?有没有一个表达式可以找到name='bal bla'并去掉bla bla?@Leo92是的,但你也可以使用dbenham的解决方案,它根本不使用Sed或grep。是的,但这不是我的观点,我想提高我的grep技能,所以请教我如何只使用grep