无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 15380|回复: 71
打印 上一主题 下一主题

[求助] 删除第N个某字符后面的所有字符

    [复制链接]
跳转到指定楼层
1#
发表于 2018-6-28 09:55:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 2012xb21cn 于 2018-6-28 10:16 编辑

1245.5545.4784264-5455.65455
结果:
1245.5545.4784264-5455

需求:提取最后一个.前面的所有字符串,或删除最后一个.后面所有字符串
( .的个数不定)

麻烦高手帮忙!!!
推荐
发表于 2018-6-28 14:45:48 | 只看该作者
2012xb21cn 发表于 2018-6-28 13:56
刚好凑巧分隔符是.,如果是其它字符就不行了

一样类似  可以set定义.代替其它分隔符 效果最明显 不需要for或findstr查找半天。

点评

赞,这个思路不错  详情 回复 发表于 2018-6-28 15:01
回复

使用道具 举报

推荐
发表于 2018-6-29 08:53:37 | 只看该作者
本帖最后由 chiannet 于 2018-6-29 09:09 编辑
holley2008 发表于 2018-6-29 07:06
获取的是第一个.后面的字符串,,,我想要的是获取第一个.前面的字符串
用for比较简单













  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. SET A1=左&SET A2=右&SET B1=前&SET B2=后

  4. :N
  5. CLS
  6. ECHO.&ECHO.
  7. ECHO.&ECHO.
  8. SET /P FS=输入定位符号并回车:
  9. REM 定位符号,赋值给FS,本批处理只能处理长度为1的单字符。
  10. IF "%FS%"=="" (ECHO.&ECHO 输入无效,请重新输入!
  11. PAUSE >NUL && CLS && GOTO N) ELSE (SET FS=%FS:~0,1%)

  12. SET "TP=%~DP0"
  13. REM 原始.TXT所在路径名,赋值给TP,以“\”结尾。
  14. IF NOT EXIST "%TP%原始.TXT" (ECHO.&ECHO 未发现"%TP%原始.TXT"
  15. PAUSE >NUL && CLS && EXIT)

  16. :M
  17. CLS
  18. SET AX=&SET BX=
  19. ECHO.&ECHO.
  20. ECHO.&ECHO              按需求变换“原始.TXT”中每行字符串
  21. ECHO.&ECHO.
  22. ECHO.&ECHO        1、取得最%A1%“%FS%”之%B1%的字符
  23. ECHO.&ECHO        2、取得最%A1%“%FS%”之%B2%的字符
  24. ECHO.&ECHO        3、取得最%A2%“%FS%”之%B1%的字符
  25. ECHO.&ECHO        4、取得最%A2%“%FS%”之%B2%的字符
  26. ECHO.&ECHO        5、退出

  27. ECHO.&ECHO.
  28. SET /P AB=输入代码并回车:
  29. IF NOT "%AB%"=="" SET AB=%AB:~0,1%
  30. IF "%AB%"=="1" (SET AX=%A1%&SET BX=%B1%)
  31. IF "%AB%"=="2" (SET AX=%A1%&SET BX=%B2%)
  32. IF "%AB%"=="3" (SET AX=%A2%&SET BX=%B1%)
  33. IF "%AB%"=="4" (SET AX=%A2%&SET BX=%B2%)
  34. IF "%AB%"=="5" EXIT
  35. IF "%AX%"=="" (ECHO.&ECHO 输入无效,请重新输入!
  36. PAUSE >NUL && CLS && GOTO M)
  37. SET PT="%TP%最%AX%定位符之%BX%的字符.TXT"
  38. DEL %PT% /F >NUL 2>NUL
  39. FOR /F "DELIMS=" %%I IN ('TYPE "%TP%原始.TXT"')  DO  CALL :L "%%I"
  40. IF EXIST %PT% (CLS&ECHO.&ECHO %PT% 已创建。&ECHO.&ECHO.&PAUSE)
  41. GOTO M

  42. :L
  43. SET "B=%~1"
  44. IF "%AB%"=="1"  (IF "%B:~0,1%"=="%FS%" (SET "RE=有一个“%FS%”位于此行首位。"&GOTO E))
  45. IF "%AB%"=="4"  (IF "%B:~-1%"=="%FS%" (SET "RE=有一个“%FS%”位于此行末尾。"&GOTO E))
  46. SET RE=此行找不到指定的定位符号"%FS%"!
  47. SET /A N=1
  48. SET "A=%~1"

  49. :R
  50. SET /A NN=%N%-1

  51. IF "%AB%"=="4" (SET "B=!A:~-%N%!"
  52.         SET "D=!B:~0,1!"
  53.         IF "!D!"=="%FS%" (SET "RE=!A:~-%NN%!"&GOTO E)
  54.         IF "!B!"=="%A%" GOTO E)

  55. IF "%AB%"=="3"  (SET D=%B:~-1,1%
  56.         SET B=!B:~0,-1!
  57.         IF "!D!"=="%FS%"  (SET "RE=!B!"&GOTO E))

  58. IF "%AB%"=="2"  (SET D=%B:~0,1%
  59.         SET B=!B:~1,100000!
  60.         IF "!D!"=="%FS%"  (SET "RE=!B!"&GOTO E))

  61. IF "%AB%"=="1" (SET "B=!A:~0,%N%!"
  62.         SET "D=!B:~-1!"
  63.         IF "!D!"=="%FS%"  (SET "RE=!A:~0,%NN%!"&GOTO E)
  64.         IF "!B!"=="%A%" GOTO E)

  65. SET /A N=%N%+1
  66. IF %AB% GTR 1 (IF %AB% LSS 4 (IF "%B%"=="" GOTO E))
  67. GOTO R

  68. :E
  69. IF %AB% GTR 1 (IF %AB% LSS 4 (IF "%RE%"=="" SET "RE=有且仅有一个“%FS%”位于此行最%BX%位。"))
  70. ECHO %RE%>>%PT%
  71. GOTO :EOF




复制代码

点评

赞一个!我下下来好好研究一下,,,学学set的用法。  发表于 2018-6-29 09:12
回复

使用道具 举报

4#
发表于 2018-6-28 09:59:59 来自手机 | 只看该作者
for /f

点评

高手能具体点吗?水平有限,用for只会截取第一个,达不到想要的结果  详情 回复 发表于 2018-6-28 10:08
回复

使用道具 举报

5#
 楼主| 发表于 2018-6-28 10:08:00 | 只看该作者

高手能具体点吗?水平有限,用for只会截取第一个,达不到想要的结果
回复

使用道具 举报

6#
发表于 2018-6-28 10:25:31 | 只看该作者
pecmd.exe

SET A=1245.5545.4784264-5455.65455
RPOS B=.,1,%A%
CALC #B=%B%-1
LSTR A2=%B%,%a%
MESS %A2%

点评

多谢高手,需要正常系统的批处理  详情 回复 发表于 2018-6-28 10:36
回复

使用道具 举报

7#
发表于 2018-6-28 10:28:11 | 只看该作者
用 for 逆序 计数  找到 .  后 用 Set 截取。

点评

多谢指点,只能再去学习下  详情 回复 发表于 2018-6-28 10:37
回复

使用道具 举报

8#
 楼主| 发表于 2018-6-28 10:36:19 | 只看该作者
chiannet 发表于 2018-6-28 10:25
pecmd.exe

SET A=1245.5545.4784264-5455.65455

多谢高手,需要正常系统的批处理
回复

使用道具 举报

9#
 楼主| 发表于 2018-6-28 10:37:14 | 只看该作者
dos时代菜鸟 发表于 2018-6-28 10:28
用 for 逆序 计数  找到 .  后 用 Set 截取。

多谢指点,只能再去学习下

点评

没有用For ,语句不够精炼。但可以实现目标。  详情 回复 发表于 2018-6-28 11:09
回复

使用道具 举报

10#
发表于 2018-6-28 10:56:09 | 只看该作者
本帖最后由 tools241 于 2018-6-28 11:05 编辑

* 如何利用 仿unix/linux命令 sed 一次替换文字中的 "某些相似性的字串" ==>
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=383106

* windows下安装 UnxUtils -- 仿 unix/linux 命令 (约120个) ==>
   http://bbs.wuyou.net/forum.php?mod=viewthread&tid=383107


echo 1245.5545.4784264-5455.65455 | sed.exe -e "s:\(.*\)\..*:\1:"
会得到
1245.5545.4784264-5455

** 注解:
sed.exe -e "编辑指令" < 输入档 > 输出档
编辑指令中有 "s/找字串一/改成字串二/" 或 "s:找字串一:改成字串二:" ,
其中 s 表示 "替代"
.  表示 "任意字",  *  表示 "前面的字出现任意次数", 因此
  .*  表示 "任意字出现任意次数"
\ 表示 将其后的字的意义 "取消 或 另做不同的解释" , \/ 表示 / , \.
表示 .
\(.*\) 表示将 \(  \) 的内容存到字串二的 \1 中 ,



评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

11#
发表于 2018-6-28 11:09:52 | 只看该作者
本帖最后由 chiannet 于 2018-6-28 11:13 编辑
2012xb21cn 发表于 2018-6-28 10:37
多谢指点,只能再去学习下



没有用For ,语句不够精炼。但可以实现目标。

  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set A=1245.5545.4784264-5455.65455
  4. CALL :LS "%A%"
  5. echo !A:~0,%D%!
  6. :END
  7. pause


  8. :LS
  9. IF %~1*==* GOTO :END
  10. SET "B=%~1"
  11. SET /A N=0
  12. SET /A D=0
  13. :LOOP
  14. SET B=%B:~0,-1%
  15. SET D2=%B:~-1,1%
  16. SET /A N=%N%+1
  17. IF "%D2%"=="."  (IF %N% GTR  %D% (SET /A  D=%N%-1))
  18. IF "%B%"=="" GOTO :EOF
  19. GOTO LOOP
复制代码

点评

多谢C大,我已经用for/f分列式弄出来了  详情 回复 发表于 2018-6-28 11:30
回复

使用道具 举报

12#
 楼主| 发表于 2018-6-28 11:30:08 | 只看该作者
chiannet 发表于 2018-6-28 11:09
没有用For ,语句不够精炼。但可以实现目标。

多谢C大,我已经用for/f分列式弄出来了

点评

不使用for,可能比较精炼的代码:  详情 回复 发表于 2018-6-28 12:01
回复

使用道具 举报

13#
发表于 2018-6-28 11:38:51 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-6-28 11:51 编辑

不知道 字符串中 . 的个数是否固定,如果知道 . 的个数是固定的,一句话就可以了。
否则,用这个 从后面 开始 一个字符一个字符的判断,并计数。明确位置,截取显示。

  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set "lx001=1245.5545.4784264-5455.65455"
  4. set "s1=."

  5. echo lx001="!lx001!"
  6. echo s1="!s1!"
  7. echo.

  8. set /a n=1
  9. :loop
  10.   for /f %%n in ("!n!") do (
  11.     if "!lx001:~%%n,1!"=="" goto end_l
  12.     if "!lx001:~-%%n,1!"=="!s1!" (    echo !lx001:~0,-%%n! &    goto end )
  13.   )
  14.   set /a n+=1
  15. goto loop
  16. :end_loop

  17. :end_l
  18.   echo 总长度 !n!,没找到 关键字符。
  19. :end
  20.   pause
复制代码

点评

这个?我可以投机取巧吗?? for /f "delims=" %%a in ("需要处理的字符") do echo %%~na  详情 回复 发表于 2018-6-28 11:54

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

14#
发表于 2018-6-28 11:54:21 来自手机 | 只看该作者
dos时代菜鸟 发表于 2018-6-28 11:38
不知道 字符串中 . 的个数是否固定,如果知道 . 的个数是固定的,一句话就可以了。
否则,用这个 从后面  ...

这个?我可以投机取巧吗??

for /f "delims=" %%a in ("需要处理的字符") do echo %%~na

点评

高,当文件名确实也能解决,并且更简练  详情 回复 发表于 2018-6-28 13:42
你这样 得到的 难道 不是 一个 文件名么?  详情 回复 发表于 2018-6-28 11:56
回复

使用道具 举报

15#
发表于 2018-6-28 11:56:58 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-6-28 11:59 编辑
nttwqz 发表于 2018-6-28 11:54
这个?我可以投机取巧吗??

for /f "delims=" %%a in ("需要处理的字符") do echo %%~na

你这样 得到的 难道 不是 一个 文件名么?

  1. 另外,FOR 变量参照的替换已被增强。你现在可以使用下列
  2. 选项语法:

  3.      %~I          - 删除任何引号("),扩展 %I
  4.      %~fI        - 将 %I 扩展到一个完全合格的路径名
  5.      %~dI        - 仅将 %I 扩展到一个驱动器号
  6.      %~pI        - 仅将 %I 扩展到一个路径
  7.      %~nI        - 仅将 %I 扩展到一个文件名
  8.      %~xI        - 仅将 %I 扩展到一个文件扩展名
  9.      %~sI        - 扩展的路径只含有短名
  10.      %~aI        - 将 %I 扩展到文件的文件属性
  11.      %~tI        - 将 %I 扩展到文件的日期/时间
  12.      %~zI        - 将 %I 扩展到文件的大小
  13.      %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
  14.                    到找到的第一个完全合格的名称。如果环境变量名
  15.                    未被定义,或者没有找到文件,此组合键会扩展到
  16.                    空字符串

  17. 可以组合修饰符来得到多重结果:

  18.      %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
  19.      %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
  20.      %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
  21.      %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
  22.                    到找到的第一个驱动器号和路径。
  23.      %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR
复制代码

点评

你可以试一下,文件名也是字符嘛!只不过不能用文件名没有的特殊字符而已,所以才叫投机取巧嘛!哈哈哈哈  详情 回复 发表于 2018-6-28 12:00
回复

使用道具 举报

16#
发表于 2018-6-28 12:00:38 来自手机 | 只看该作者
dos时代菜鸟 发表于 2018-6-28 11:56
你这样 得到的 难道 不是 一个 文件名么?

你可以试一下,文件名也是字符嘛!只不过不能用文件名没有的特殊字符而已,所以才叫投机取巧嘛!哈哈哈哈

点评

有道理,分隔符 恰恰是 文件名 扩展名 分隔符。 哈哈哈。 这个可以有。  详情 回复 发表于 2018-6-28 12:02

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

17#
发表于 2018-6-28 12:01:04 | 只看该作者
本帖最后由 chiannet 于 2018-6-28 12:02 编辑
2012xb21cn 发表于 2018-6-28 11:30
多谢C大,我已经用for/f分列式弄出来了


不使用for,可能比较精炼的代码:

  1. @ECHO OFF

  2. SET "B=1245.5545.4784264-5455.65455"
  3. SET RESULT=找不到.

  4. :LOOP
  5. SET D=%B:~-1,1%
  6. SET B=%B:~0,-1%
  7. IF "%D%"=="."  (SET "RESULT=%B%" && GOTO :END)
  8. IF "%B%"=="" GOTO :END
  9. GOTO LOOP

  10. :END
  11. ECHO %RESULT%
  12. PAUSE
  13. EXIT
复制代码

点评

没有 setlocal ENABLEDELAYEDEXPANSION的情况西啊,你这个 更清新 。  详情 回复 发表于 2018-6-28 12:11
回复

使用道具 举报

18#
发表于 2018-6-28 12:02:12 | 只看该作者
nttwqz 发表于 2018-6-28 12:00
你可以试一下,文件名也是字符嘛!只不过不能用文件名没有的特殊字符而已,所以才叫投机取巧嘛!哈哈哈哈

有道理,分隔符 恰恰是 文件名 扩展名 分隔符。
哈哈哈。
这个可以有。
回复

使用道具 举报

19#
发表于 2018-6-28 12:11:25 | 只看该作者
chiannet 发表于 2018-6-28 12:01
不使用for,可能比较精炼的代码:


没有 setlocal ENABLEDELAYEDEXPANSION的情况下,你这个  更清新 。
回复

使用道具 举报

20#
发表于 2018-6-28 12:13:49 | 只看该作者
有沒有獲取 %~dp0 ,但不要有最後面那個 \
我不要用 %CD%
回复

使用道具 举报

21#
发表于 2018-6-28 12:49:39 来自手机 | 只看该作者
本帖最后由 窄口牛 于 2018-6-28 12:50 编辑

没你们那么高的水平,不过我也觉得用文件名和扩展名处理挺简单的。看上去他这个案例恰巧也不会有特殊字符。
回复

使用道具 举报

22#
 楼主| 发表于 2018-6-28 13:42:00 | 只看该作者
nttwqz 发表于 2018-6-28 11:54
这个?我可以投机取巧吗??

for /f "delims=" %%a in ("需要处理的字符") do echo %%~na

高,当文件名确实也能解决,并且更简练
回复

使用道具 举报

23#
发表于 2018-6-28 13:47:48 | 只看该作者
本帖最后由 holley2008 于 2018-6-28 13:48 编辑

你想多了...
直接把其当做一个文件名

  1. @echo off&setlocal enabledelayedexpansion
  2. set str=1245.5545.4784264-5455.65455
  3. for %%i in ("%str%") do set "newstr=%%~ni"
  4. echo %newstr%
复制代码

即可得到你要的结果。

点评

刚好凑巧分隔符是.,如果是其它字符就不行了  详情 回复 发表于 2018-6-28 13:56
回复

使用道具 举报

24#
 楼主| 发表于 2018-6-28 13:56:44 | 只看该作者
holley2008 发表于 2018-6-28 13:47
你想多了...
直接把其当做一个文件名

刚好凑巧分隔符是.,如果是其它字符就不行了

点评

一样类似 可以set定义.代替其它分隔符 效果最明显 不需要for或findstr查找半天。  详情 回复 发表于 2018-6-28 14:45
回复

使用道具 举报

25#
发表于 2018-6-28 14:02:04 | 只看该作者
  1. ### 友情提示:本脚本由 Au3.REHelper 于 2018/06/28 14:01 自动生成,不保证其正确性,请自行测试 ###
  2. Local $sSource = '1245.5545.4784264-5455.65455'
  3. ;~MsgBox(0, '源字符串', $sSource)
  4. Local $sSRERe = StringRegExpReplace($sSource, '(.*?)(.\w+), '$1')
  5. MsgBox(0, '替换结果', $sSRERe)
复制代码

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

26#
 楼主| 发表于 2018-6-28 15:01:40 | 只看该作者
holley2008 发表于 2018-6-28 14:45
一样类似  可以set定义.代替其它分隔符 效果最明显 不需要for或findstr查找半天。

赞,这个思路不错

点评

这个并不太好,比如以下字符串 如果要以","为分隔符,截取最右","之前的字符,如果把","替换为".",再按文件名来整,显然会报错。其实16楼的比较精炼了。 稍微改一下,还可以实现获取最左"."后的字  详情 回复 发表于 2018-6-28 16:00
回复

使用道具 举报

27#
发表于 2018-6-28 16:00:44 | 只看该作者
本帖最后由 chiannet 于 2018-6-28 16:02 编辑
2012xb21cn 发表于 2018-6-28 15:01
赞,这个思路不错




这个并不太好,比如以下字符串


  1. 1245.55,45.478,4264-5455.65,4.55

复制代码


如果要以","为分隔符,截取最右","之前的字符,如果把","替换为".",再按文件名来整,显然会得错误结果。其实16楼的比较精炼了。

稍微改一下,还可以实现获取最左"."后的字符串等。

点评

16F的通用性确实好很多! 但突然发神经,想获取第一个.号前面的字符串呢? 脑阔大!!!  详情 回复 发表于 2018-6-28 18:13
那如何批量从文件中读取修改呢(每行都是类似数据)?试着改了下总不成功  详情 回复 发表于 2018-6-28 16:06
回复

使用道具 举报

28#
 楼主| 发表于 2018-6-28 16:06:27 | 只看该作者
chiannet 发表于 2018-6-28 16:00
这个并不太好,比如以下字符串

那如何批量从文件中读取修改呢(每行都是类似数据)?试着改了下总不成功
回复

使用道具 举报

29#
发表于 2018-6-28 17:03:54 | 只看该作者
2012xb21cn 发表于 2018-6-28 16:06
那如何批量从文件中读取修改呢(每行都是类似数据)?试着改了下总不成功
  1. @ECHO OFF
  2. del "%~DP0转化后.TXT" /F >NUL 2>NUL
  3. FOR /F "delims=" %%I IN ('type "%~DP0原始.txt"')  DO  CALL :L "%%I"
  4. EXIT

  5. :L
  6. SET "B=%~1"
  7. SET RE=此行找不到”.“

  8. :R
  9. SET D=%B:~-1,1%
  10. SET B=%B:~0,-1%
  11. IF "%D%"=="."  (SET "RE=%B%"&&GOTO :E)
  12. IF "%B%"=="" GOTO :E
  13. GOTO R

  14. :E
  15. ECHO %RE% >>"%~DP0转化后.TXT"
  16. GOTO :EOF
复制代码

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

30#
发表于 2018-6-28 17:05:05 | 只看该作者
修改一下上面代码的原始.txt及转化后.txt的路径

点评

多谢C大,换其它字符都测试成功  详情 回复 发表于 2018-6-28 17:26
回复

使用道具 举报

31#
 楼主| 发表于 2018-6-28 17:26:19 | 只看该作者
chiannet 发表于 2018-6-28 17:05
修改一下上面代码的原始.txt及转化后.txt的路径

多谢C大,换其它字符都测试成功
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-26 04:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表