Board logo

标题: [探讨][征集][去变量左右、首尾空格的方法] [打印本页]

作者: redtek     时间: 2006-11-29 02:43    标题: [探讨][征集][去变量左右、首尾空格的方法]

去左、右含有空格的变量试验 与 另类方法实现演示

(测试版本: Windows  CMD  Shell )
(      纯dos下此代码无效)

(特殊特号等意外问题下面代码中不考虑,只演示原理)



(这篇贴子的原由:在纯DOS交流区看到一遍“如何忽略掉用户输入路径前后的空格?”的属于CMD Shell内容的文章)

(        原提问贴:http://www.cn-dos.net/forum/viewthread.php?tid=25062&sid=qljZ68)
(        以致于对 CMD Shell 感兴趣的网友没有注意到纯DOS区内的非纯DOS内容)
(        贴子发错了讨论区,就象是把重要的财务部收的文件直接放到了售后服务部…)
(        建议:要快速的及时解决问题,请千万不要把贴子发错讨论区~:)
@echo %dbg% off
cls && echo. && echo.
:Redtek 2006 去左、右含有空格的变量试验与另类方法实现演示
::  为演示与另做它用方便,所以“标签代码段”内的代码都可以独立使用

set "var=               My name is Redtek            "



rem  注:下面 Call 中的参数是无引号的,利用参数以逗号空格等做为分隔的特性
call :去左侧空格  %var%

echo. && echo.

call :去右侧空格  "%var%"

rem  去字符串中的左、右空格
rem  为演示与另做它用的方便,下面步骤将重新编写去左右空格的代码段,可以独立使用。

echo. && echo.

call :去两边空格  "%var%"  %var%

goto :eof



:去左侧空格

        rem  利用替换原理,将变量 var 中 以 ^%1变量内容开头字串的左边一切替换为^1本身
        rem  因为被 Call 过来以后,参数中的空格就全“丢了”(利用参数分隔的特性),
        rem  所以,自然那个要被定位的 ^%1 左边的空格也就全没了。

        call set "去左空格后的变量=%%var:*%1=%1%%

        echo  原字符串:                [%var%]
        echo  去左侧空格后的字符串:        [%去左空格后的变量%]
        goto  :eof


:去右侧空格

        rem 将结果赋值给变量,这个变量可以随便调用。
        rem ~nx 是利用了“将变量扩展到一个文件名”的特性,
        rem 既然是合法的文件名,当然文件名后面的空格是无效且无用的~:)

        set 去右空格后的变量=%~nx1

        echo  原字符串:                [%var%]
        echo  去右侧空格后的字符串:        [%去右空格后的变量%]
        goto  :eof       
       

:去两边空格

        rem 原理:先去左边空格,再去右边空格,相当于上面演示代码的合用:)
        rem    在假如没有上面两段去左和去右空格的代码情况下,下面独立演示:

        set 去左右空格后的变量=%~nx1
        call set "去左右空格后的变量=%%去左右空格后的变量:*%2=%2%%"

        echo  原字符串:                [%var%]
        echo  去左右空格后的字符串:        [%去左右空格后的变量%]
        goto :eof
       
代码全加了注释,以方便阅读:)


(输出测试结果:)
原字符串:                [               My name is Redtek            ]
去左侧空格后的字符串:        [My name is Redtek            ]


原字符串:                [               My name is Redtek            ]
去右侧空格后的字符串:        [               My name is Redtek]


原字符串:                [               My name is Redtek            ]
去左右空格后的字符串:        [My name is Redtek]
但,上面代码的实现方法并不是唯一,也不是最简单的方法,它只代表一种另类的实现。
所以请不要当此贴为唯一的解决方案,也不要将此贴的方法完全认为是正确的。


(此贴也为抛砖引玉,希望感兴趣的朋友继续增加不同的实现方法,越好玩越好~:)

[建议]请感兴趣的朋友一定要跟贴加入你常用的技巧,以方便入门的初学者参考和大家之间的交流,同时增加论坛人气~:)

[ Last edited by redtek on 2006-11-29 at 10:32 AM ]
作者: NaturalJ0     时间: 2006-11-29 03:35
redtek 的方法很巧妙啊。

call set "去左空格后的变量=%%var:*%1=%1%%

这两个红色的地方想请教下。
作者: ccwan     时间: 2006-11-29 03:56

作者: redtek     时间: 2006-11-29 04:04
call set "去左空格后的变量=%%var:*%1=%1%%中的 “*” 号:

原变量是: 
set "var=               My name is Redtek            "

那个 * 号就是相当于用 %1 (就是上面变量中的 My )来替换 var 变量中的 *%1(指 字符串 My 左边的一切字符)。
作者: NaturalJ0     时间: 2006-11-29 04:14
经你提醒,想起 namejm 给我的去引号方法了,现在全看明白了。^_^
作者: redtek     时间: 2006-11-29 04:31
NaturalJ0兄也把你的一些去空格的方法贴上吧,无论是VBS还是JS还是Debug等……
我们让这些操作的方法都全了吧~:)

这样又方便索引查找去空格的方法又提高大家交流的某个专项内容的热情~:)

[ Last edited by redtek on 2006-11-28 at 03:44 PM ]
作者: NaturalJ0     时间: 2006-11-29 04:48
哇,你当我是高手啊。 o_O
其实 VBS JS DEBUG 我都不会的说。
作者: redtek     时间: 2006-11-29 04:51
那些我也不会,哈哈……
作者: ccwan     时间: 2006-11-29 05:24
不瞒各位,偶也是都不会。
给大家看看我手底下全部的JS材料,别笑偶。
附件 1: .JS.rar (2006-11-29 05:24, 547 bytes, 下载附件所需积分 1点 ,下载次数: 50)

作者: lxmxn     时间: 2006-11-29 05:45

  哇,还有这么多人和我一样,都不会哈~哈哈~

  Redtek 兄真是show得精彩,加分没商量~

作者: lxmxn     时间: 2006-11-29 05:55

  我加一个去掉全部空格的……
@echo %dbg% off
set "var=    W W W . C N - D O S . N E T    "
echo [%var%]
set var=%var: =%
echo [%var%]
pause

作者: electronixtar     时间: 2006-11-29 06:39
其实用 vbs的ltrim 和 rtrim 和trim 就行鸟
作者: namejm     时间: 2006-11-29 07:36
  去掉左侧空格1:
@echo off
set "str=   ab c&>!   "
for /f "tokens=*" %%i in ("%str%") do echo "☆%%i☆"
pause
  去掉左侧空格2:
@echo off
set "str=   ab c&>!   "
:intercept
if "%str:~0,1%"==" " set "str=%str:~1%"&goto intercept
echo "☆%str%☆"
pause
  去掉右侧空格1:
@echo off
set "str=   ab c&>!   "
for /f "delims=" %%i in ("%str%") do echo "☆%%~nxi☆"
pause
  去掉右侧空格2:
@echo off
set "str=   ab c&>!   "
:intercept
if "%str:~-1%"==" " set "str=%str:~0,-1%"&goto intercept
echo "☆%str%☆"
pause
  去掉首尾空格1:
@echo off
set "str=   ab c&>!   "
for /f "tokens=*" %%i in ("%str%") do echo "☆%%~nxi☆"
pause
  去掉首尾空格2:
@echo off
set "str=   ab c&>!   "

:intercept_left
if "%str:~0,1%"==" " set "str=%str:~1%"&goto intercept_left

:intercept_right
if "%str:~-1%"==" " set "str=%str:~0,-1%"&goto intercept_right
echo "☆%str%☆"
pause
  去掉所有空格:
@echo off
set "str=   ab c&>!   "
set "str=%str: =%"
echo "☆%str%☆"
pause
  以上代码能兼容除双引号外的其他特殊字符。

[ Last edited by namejm on 2007-6-21 at 06:58 PM ]
作者: redtek     时间: 2006-11-29 07:46
欣赏~~版主的代码甚是精彩!!!
现在去空格的方法越来越全啦~:)))
作者: vkill     时间: 2006-11-29 08:02
sed,任何特殊字符都考虑

去掉左侧所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/^[ \t]*//"|more>test.txt
set /p var=<test.txt

去掉右侧所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/[ \t]*$//"|more>test.txt
set /p var=<test.txt

去掉首尾所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/^[ \t]*//;s/[ \t]*$//"|more>test.txt
set /p var=<test.txt

去掉所有空格:
echo "%var%"|sed -e "s/^\x22//;s/\x22$//" -e "s/ //g"|more>test.txt
set /p var=<test.txt

[ Last edited by vkill on 2006-11-29 at 08:04 AM ]
作者: lxmxn     时间: 2006-11-29 08:02


  Quote:
去掉右侧空格2:

@echo off
set str1=   ab c
set str2=★%str1%★
for /f "tokens=1 delims=★" %%i in ("%str2%") do echo ☆%%i☆
pause

  版主这个后面没有跟空格,经测试也没有去掉空格,再考虑下?

作者: namejm     时间: 2006-11-29 08:25
  呵呵,set设置出错,导致代码的编写出了问题,此方案似乎行不通。
作者: yangshijiangzh     时间: 2006-11-29 11:31    标题: 好啊

你们好棒的哦
作者: leoson88     时间: 2006-12-23 11:58
那问个问题有没有往现有的文本里面加, 。;之类的符号的方法呢?又要怎么能实现呢?
作者: leoson88     时间: 2006-12-23 12:00
补充一个,比如说给每个英文单词后面加个逗号(,)之类的,如何实现呢?
作者: namejm     时间: 2006-12-23 12:04
  为了使帖子内容与标题保持一致,建议你开新帖提问,注意要把条件描述清楚,如有可能,请举例说明。
作者: leoson88     时间: 2006-12-23 23:11
恩知道了谢谢提醒~
作者: teados     时间: 2007-4-30 11:38
其实直接利用一个CALL标签的功能就可以实现了吧,我是一直这样用的。
@echo off

set str=  *sf sflj9   
call :trim %str%
echo [%str%]
pause

goto end
:trim
set str=%*

:end

作者: gmy     时间: 2008-2-19 11:44
我只想去掉变量右边的一个空格,怎么办?
作者: fastslz     时间: 2008-2-19 11:48


  Quote:
Originally posted by gmy at 2008-2-19 11:44:
我只想去掉变量右边的一个空格,怎么办?

变量字符里可能有空格,只想去掉最后一个空格吗?
作者: fastslz     时间: 2008-2-19 11:57

@echo off
set "str=   a b c "
set Tmp=%str:~-1%
if "%Tmp%"==" " set "str=%str:~0,-1%"
echo "%str%"
pause

作者: gmy     时间: 2008-2-19 12:10
谢谢,已经不需要了,是我的一个误操作.
作者: yuanye002     时间: 2008-2-19 17:27
厉害,全是高手。。
学习中。
作者: peterchenxi     时间: 2010-1-22 22:40
我想看看那个js