2012xb21cn 发表于 2018-6-28 09:55:13

删除第N个某字符后面的所有字符

本帖最后由 2012xb21cn 于 2018-6-28 10:16 编辑

1245.5545.4784264-5455.65455
结果:
1245.5545.4784264-5455

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

麻烦高手帮忙!!!

holley2008 发表于 2018-6-28 14:45:48

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

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

chiannet 发表于 2018-6-29 08:53:37

本帖最后由 chiannet 于 2018-6-29 09:09 编辑

holley2008 发表于 2018-6-29 07:06
获取的是第一个.后面的字符串,,,我想要的是获取第一个.前面的字符串
用for比较简单














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

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

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

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

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

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

:R
SET /A NN=%N%-1

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

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

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

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

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

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




nttwqz 发表于 2018-6-28 09:59:59

for /f

2012xb21cn 发表于 2018-6-28 10:08:00

nttwqz 发表于 2018-6-28 09:59
for /f

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

chiannet 发表于 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%

dos时代菜鸟 发表于 2018-6-28 10:28:11

用 for 逆序 计数找到 .后 用 Set 截取。

2012xb21cn 发表于 2018-6-28 10:36:19

chiannet 发表于 2018-6-28 10:25
pecmd.exe

SET A=1245.5545.4784264-5455.65455


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

2012xb21cn 发表于 2018-6-28 10:37:14

dos时代菜鸟 发表于 2018-6-28 10:28
用 for 逆序 计数找到 .后 用 Set 截取。

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

tools241 发表于 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 中 ,



chiannet 发表于 2018-6-28 11:09:52

本帖最后由 chiannet 于 2018-6-28 11:13 编辑

2012xb21cn 发表于 2018-6-28 10:37
多谢指点,只能再去学习下


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

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
set A=1245.5545.4784264-5455.65455
CALL :LS "%A%"
echo !A:~0,%D%!
:END
pause


:LS
IF %~1*==* GOTO :END
SET "B=%~1"
SET /A N=0
SET /A D=0
:LOOP
SET B=%B:~0,-1%
SET D2=%B:~-1,1%
SET /A N=%N%+1
IF "%D2%"=="."(IF %N% GTR%D% (SET /AD=%N%-1))
IF "%B%"=="" GOTO :EOF
GOTO LOOP

2012xb21cn 发表于 2018-6-28 11:30:08

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

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

dos时代菜鸟 发表于 2018-6-28 11:38:51

本帖最后由 dos时代菜鸟 于 2018-6-28 11:51 编辑

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

@echo off
setlocal ENABLEDELAYEDEXPANSION
set "lx001=1245.5545.4784264-5455.65455"
set "s1=."

echo lx001="!lx001!"
echo s1="!s1!"
echo.

set /a n=1
:loop
for /f %%n in ("!n!") do (
    if "!lx001:~%%n,1!"=="" goto end_l
    if "!lx001:~-%%n,1!"=="!s1!" (    echo !lx001:~0,-%%n! &    goto end )
)
set /a n+=1
goto loop
:end_loop

:end_l
echo 总长度 !n!,没找到 关键字符。
:end
pause

nttwqz 发表于 2018-6-28 11:54:21

dos时代菜鸟 发表于 2018-6-28 11:38
不知道 字符串中 . 的个数是否固定,如果知道 . 的个数是固定的,一句话就可以了。
否则,用这个 从后面...

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

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

dos时代菜鸟 发表于 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
你这样 得到的 难道 不是 一个 文件名么?

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

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

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

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

nttwqz 发表于 2018-6-28 12:00:38

dos时代菜鸟 发表于 2018-6-28 11:56
你这样 得到的 难道 不是 一个 文件名么?

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

chiannet 发表于 2018-6-28 12:01:04

本帖最后由 chiannet 于 2018-6-28 12:02 编辑

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

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

@ECHO OFF

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

:LOOP
SET D=%B:~-1,1%
SET B=%B:~0,-1%
IF "%D%"=="."(SET "RESULT=%B%" && GOTO :END)
IF "%B%"=="" GOTO :END
GOTO LOOP

:END
ECHO %RESULT%
PAUSE
EXIT

dos时代菜鸟 发表于 2018-6-28 12:02:12

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

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

dos时代菜鸟 发表于 2018-6-28 12:11:25

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

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

guies 发表于 2018-6-28 12:13:49

有沒有獲取 %~dp0 ,但不要有最後面那個 \
我不要用 %CD%

窄口牛 发表于 2018-6-28 12:49:39

本帖最后由 窄口牛 于 2018-6-28 12:50 编辑

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

2012xb21cn 发表于 2018-6-28 13:42:00

nttwqz 发表于 2018-6-28 11:54
这个?我可以投机取巧吗??

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

高,当文件名确实也能解决,并且更简练{:1_195:}

holley2008 发表于 2018-6-28 13:47:48

本帖最后由 holley2008 于 2018-6-28 13:48 编辑

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

@echo off&setlocal enabledelayedexpansion
set str=1245.5545.4784264-5455.65455
for %%i in ("%str%") do set "newstr=%%~ni"
echo %newstr%

即可得到你要的结果。

2012xb21cn 发表于 2018-6-28 13:56:44

holley2008 发表于 2018-6-28 13:47
你想多了...
直接把其当做一个文件名



刚好凑巧分隔符是.,如果是其它字符就不行了{:1_192:}

xzf680 发表于 2018-6-28 14:02:04

### 友情提示:本脚本由 Au3.REHelper 于 2018/06/28 14:01 自动生成,不保证其正确性,请自行测试 ###
Local $sSource = '1245.5545.4784264-5455.65455'
;~MsgBox(0, '源字符串', $sSource)
Local $sSRERe = StringRegExpReplace($sSource, '(.*?)(.\w+), '$1')
MsgBox(0, '替换结果', $sSRERe)

2012xb21cn 发表于 2018-6-28 15:01:40

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

赞,这个思路不错

chiannet 发表于 2018-6-28 16:00:44

本帖最后由 chiannet 于 2018-6-28 16:02 编辑

2012xb21cn 发表于 2018-6-28 15:01
赞,这个思路不错



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


1245.55,45.478,4264-5455.65,4.55



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

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

2012xb21cn 发表于 2018-6-28 16:06:27

chiannet 发表于 2018-6-28 16:00
这个并不太好,比如以下字符串




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

chiannet 发表于 2018-6-28 17:03:54

2012xb21cn 发表于 2018-6-28 16:06
那如何批量从文件中读取修改呢(每行都是类似数据)?试着改了下总不成功

@ECHO OFF
del "%~DP0转化后.TXT" /F >NUL 2>NUL
FOR /F "delims=" %%I IN ('type "%~DP0原始.txt"')DOCALL :L "%%I"
EXIT

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

:R
SET D=%B:~-1,1%
SET B=%B:~0,-1%
IF "%D%"=="."(SET "RE=%B%"&&GOTO :E)
IF "%B%"=="" GOTO :E
GOTO R

:E
ECHO %RE% >>"%~DP0转化后.TXT"
GOTO :EOF

chiannet 发表于 2018-6-28 17:05:05

修改一下上面代码的原始.txt及转化后.txt的路径

2012xb21cn 发表于 2018-6-28 17:26:19

chiannet 发表于 2018-6-28 17:05
修改一下上面代码的原始.txt及转化后.txt的路径

多谢C大,换其它字符都测试成功{:1_192:}
页: [1] 2
查看完整版本: 删除第N个某字符后面的所有字符