如何在特定单词后剪切字符串?

mif*_*ifu 2 string cut batch-file delimiter

一旦字符串, TARO/出现,我如何在我的.bat文件中剪切这些字符串?

Init., 12, TARO/ BLA BLA CDE
Ademanto, TARO/ BLA BLA XYZ
Run Code Online (Sandbox Code Playgroud)

我只想拥有Init., 12Ademanto之后.

我不能在FOR中使用分隔符,因为它仅限于一个单个字符,对吧?

Ste*_*han 6

set能够从开头剪切到定义的字符串,但不能从定义的字符串剪切到最后.使用小技巧有助于:

setlocal enabledelayedexpansion
set "string=Init., 12, TARO/ BLA BLA CDE" 
set "str=%string:*TARO/=TARO/%"
echo "!string:%str%=!"
Run Code Online (Sandbox Code Playgroud)

(将包含delimiter-string(*TARO/)的字符串的开头替换为仅使用分隔符字符串(TARO/).在第二步中,删除找到的字符串)

另一种方法是使用单个char分隔符替换delimiter-string(任何确定不在字符串中的char.(下面(þ)的奇怪符号是a chr(127),但你也可以使用@,#或者任何其他的char'你的字符串中的t)

for /f "delims=þ" %%i in ("%string:TARO/=þ%") do echo %%i
Run Code Online (Sandbox Code Playgroud)


roj*_*ojo 6

还有另一种方式.替换, TARO/&rem;.

@echo off
setlocal

set "str=Init., 12, TARO/ BLA BLA CDE"
set str=%str:, TARO/=&rem;%

echo %str%
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为在set评估命令之前扩展了变量.因此,当评估线时,它被评估为......

set str=Init.,12&rem; BLAH BLAH CDE
Run Code Online (Sandbox Code Playgroud)

......作为复合命令 set var=value & rem (rest of line ignored)

你也可以echo %str:, TARO/=&rem;%达到同样的效果.

  • 只要字符串在截止字符串之前不包含引号或毒药字符就应该正常工作,这对于示例文本肯定是正确的. (3认同)

dbe*_*ham 5

这是一个更强大的解决方案,即使字符串包含引号或毒性字符也应该有效 - 用新行字符替换cutoff字符串.FOR/F将迭代每个结果行,因此使用GOTO突破循环并保留第一行.

@echo off
setlocal disableDelayedExpansion
set "string=;Init., 12, TARO/ BLA BLA CDE"
setlocal enableDelayedExpansion
set ^"string=!string:, TARO/=^

!^"
for /f delims^=^ eol^= %%A in ("!string!") do (
  endlocal
  set "string=%%A"
  goto :break
)
:break
set string
Run Code Online (Sandbox Code Playgroud)