控制字符和字符串操作

时间:2015-07-14 00:07:12

标签: string batch-file

使用ss64 by Jeb上发布的技巧将退格控制字符保存到变量中 - 当'重叠'退格时,我得到奇怪的结果。

示例是在此处发布的代码高尔夫挑战:Backhanded^H^H^H^H^H^Hspaces(非常感谢有关缩短此代码的任何提示)。

Ungolfed看起来像这样:

@echo off
setLocal enableDelayedExpansion

for /F %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a

set s=%1
echo %s:^H=!DEL!%

基本上,它使用Jeb的技巧将退格保存为变量,然后使用字符串操作将输入字符串中的^H的所有实例替换为该变量。这适用于以下示例和类似输入:

C:\>bsp.bat "testing^H^H^H test"
"test test"

然而,当^H的“重叠”使用发生时,我得到以下混淆(对我而言)输出:

C:\>bsp.bat "AAA^HB^H^H"
"A"B

我的问题是 - 在上面的示例中,为什么我收到此输出而不是预期的"A"

2 个答案:

答案 0 :(得分:4)

我不明白为什么"预期输出"应该是" A"。看到这个逐个字符的输出:

bsp.bat "AAA^HB^H^H"
"
"A
"AA
"AAA
"AAA    <- backspace, the cursor is over last "A"
"AAB
"AAB    <- backspace, the cursor is over last "B"
"AAB    <- backspace, the cursor is over second "A"
"A"B

只有的BS角色将光标移回一个字符。 &#34;标准行为&#34; BackSpace密钥(也称为&#34; BackSpace echo&#34;)是&#34; BackSpace + space + BackSpace&#34;。

顺便说一下,这是我用来获得BS角色的方法:

for /F %%a in ('echo prompt $H ^| cmd') do set BS=%%a

答案 1 :(得分:3)

预期"A"B结果是因为退格字符(0x08)<BS>仅在不删除字符的情况下将光标向后移动。

当您使用PROMPT $ H时,它实际上会打印<BS><space><BS>。第一个<BS>向后移动一个,空格覆盖(视觉上清除)角色,然后第二个<BS>再次向后移动到你想要的位置。

FOR / F的默认分隔符为<tab><space>,因此您的分配仅保留第一个<BS>。将分隔符更改为“r”,您将获得所需的结果:

@echo off
setLocal enableDelayedExpansion

for /F "delims=r" %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a

set s=%1
echo %s:^H=!DEL!%

或者,保留单个<bs>定义并自行明确覆盖该角色:

@echo off
setLocal enableDelayedExpansion

for /F %%a in ('"prompt $H&echo on&for %%b in (1) do rem"') do set DEL=%%a

set s=%1
echo %s:^H=!DEL! !DEL!%