删除第N个某字符后面的所有字符
本帖最后由 2012xb21cn 于 2018-6-28 10:16 编辑1245.5545.4784264-5455.65455
结果:
1245.5545.4784264-5455
需求:提取最后一个.前面的所有字符串,或删除最后一个.后面所有字符串
( .的个数不定)
麻烦高手帮忙!!! 2012xb21cn 发表于 2018-6-28 13:56
刚好凑巧分隔符是.,如果是其它字符就不行了
一样类似可以set定义.代替其它分隔符 效果最明显 不需要for或findstr查找半天。 本帖最后由 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
for /f nttwqz 发表于 2018-6-28 09:59
for /f
高手能具体点吗?水平有限,用for只会截取第一个,达不到想要的结果 pecmd.exe
SET A=1245.5545.4784264-5455.65455
RPOS B=.,1,%A%
CALC #B=%B%-1
LSTR A2=%B%,%a%
MESS %A2% 用 for 逆序 计数找到 .后 用 Set 截取。 chiannet 发表于 2018-6-28 10:25
pecmd.exe
SET A=1245.5545.4784264-5455.65455
多谢高手,需要正常系统的批处理 dos时代菜鸟 发表于 2018-6-28 10:28
用 for 逆序 计数找到 .后 用 Set 截取。
多谢指点,只能再去学习下 本帖最后由 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: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 chiannet 发表于 2018-6-28 11:09
没有用For ,语句不够精炼。但可以实现目标。
多谢C大,我已经用for/f分列式弄出来了 本帖最后由 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 dos时代菜鸟 发表于 2018-6-28 11:38
不知道 字符串中 . 的个数是否固定,如果知道 . 的个数是固定的,一句话就可以了。
否则,用这个 从后面...
这个?我可以投机取巧吗??
for /f "delims=" %%a in ("需要处理的字符") do echo %%~na 本帖最后由 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
dos时代菜鸟 发表于 2018-6-28 11:56
你这样 得到的 难道 不是 一个 文件名么?
你可以试一下,文件名也是字符嘛!只不过不能用文件名没有的特殊字符而已,所以才叫投机取巧嘛!哈哈哈哈 本帖最后由 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 nttwqz 发表于 2018-6-28 12:00
你可以试一下,文件名也是字符嘛!只不过不能用文件名没有的特殊字符而已,所以才叫投机取巧嘛!哈哈哈哈
有道理,分隔符 恰恰是 文件名 扩展名 分隔符。
哈哈哈。
这个可以有。
chiannet 发表于 2018-6-28 12:01
不使用for,可能比较精炼的代码:
没有 setlocal ENABLEDELAYEDEXPANSION的情况下,你这个更清新 。 有沒有獲取 %~dp0 ,但不要有最後面那個 \
我不要用 %CD% 本帖最后由 窄口牛 于 2018-6-28 12:50 编辑
没你们那么高的水平,不过我也觉得用文件名和扩展名处理挺简单的。看上去他这个案例恰巧也不会有特殊字符。 nttwqz 发表于 2018-6-28 11:54
这个?我可以投机取巧吗??
for /f "delims=" %%a in ("需要处理的字符") do echo %%~na
高,当文件名确实也能解决,并且更简练{:1_195:} 本帖最后由 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%
即可得到你要的结果。 holley2008 发表于 2018-6-28 13:47
你想多了...
直接把其当做一个文件名
刚好凑巧分隔符是.,如果是其它字符就不行了{:1_192:} ### 友情提示:本脚本由 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)
holley2008 发表于 2018-6-28 14:45
一样类似可以set定义.代替其它分隔符 效果最明显 不需要for或findstr查找半天。
赞,这个思路不错 本帖最后由 chiannet 于 2018-6-28 16:02 编辑
2012xb21cn 发表于 2018-6-28 15:01
赞,这个思路不错
这个并不太好,比如以下字符串
1245.55,45.478,4264-5455.65,4.55
如果要以","为分隔符,截取最右","之前的字符,如果把","替换为".",再按文件名来整,显然会得错误结果。其实16楼的比较精炼了。
稍微改一下,还可以实现获取最左"."后的字符串等。 chiannet 发表于 2018-6-28 16:00
这个并不太好,比如以下字符串
那如何批量从文件中读取修改呢(每行都是类似数据)?试着改了下总不成功 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 修改一下上面代码的原始.txt及转化后.txt的路径 chiannet 发表于 2018-6-28 17:05
修改一下上面代码的原始.txt及转化后.txt的路径
多谢C大,换其它字符都测试成功{:1_192:}
页:
[1]
2