标题: [文本处理] 【已解决】批处理提取指定字符内容 [打印本页]
作者: fzp070 时间: 2024-12-12 18:03 标题: 【已解决】批处理提取指定字符内容
描述:
1、需提取的是一个Cook信息,是在一行内,想提取SESSDATA=167.......0C;这段内容。
2、之前用得笨办法,是以;分隔来数SESSDATA位于第几个来提取,但现在SESSDATA值在29位,而字母只有26个,已超出范围,没法用,除非先删除一部分内容,再弄,这样挺麻烦的。
故发贴求助大佬指导!
注:以下仅举例,所有的值,均已被处理过,替换为Z...3了,实际都是不同的字符内容。知悉!
CURRENT_BLACKGAP=Z...3; hit-dyn-v2=Z...3; FEED_LIVE_VERSION=Z...3; LIVE_BUVID=Z...3; PVID=Z...3; rpdid=Z...3; buvid_fp_plain=Z...3; buvid_fp=Z...3; buvid4=Z...3; _uuid=Z...3; fingerprint=Z...3; bmg_af_switch=Z...3; CURRENT_QUALITY=Z...3; bmg_src_def_domain=Z...3; browser_resolution=Z...3; enable_web_push=Z...3; header_theme_version=Z...3; home_feed_column=Z...3; b_nut=Z...3; buvid3=Z...3; bsource_origin=Z...3; bmg_af_switch=Z...3; bmg_src_def_domain=Z...3; share_source_origin=Z...3; bili_ticket=Z...3; bili_ticket_expires=Z...3; DedeUserID=Z...3; DedeUserID__ckMd5=Z...3; SESSDATA=167.......0C; bili_jct=Z...3; sid=Z...3; bp_t_offset_330614218=Z...3; CURRENT_FNVAL=Z...3; b_lsid=Z...3; bsource=Z...3
作者: 77七 时间: 2024-12-12 18:22
试试这一些
链接
作者: fzp070 时间: 2024-12-12 18:58
回复 2# 77七
谢谢帮助!我认真看看研究下
目前我是采用下面的笨办法来的,缺点是获取的SESSDATA位置再变化,代码也要手动改,没法自动精准识别。- for /f "tokens=28*" %%a in (test.txt) do (set temp1=%%b)
- for /f "tokens=1-2 delims=; " %%a in ('echo %temp1%') do (set cookie_SESSDATA=SESSDATA=%%b)
- echo %cookie_SESSDATA%;
- echo %cookie_SESSDATA%;>cookie2.txt
复制代码
作者: 77七 时间: 2024-12-12 19:34
回复 3# fzp070
- @echo off
- cd /d "%~dp0"
- for /f "useback delims=" %%a in ("1.txt") do (
- set str=%%a
- setlocal enabledelayedexpansion
- for /f "delims==;" %%b in ("!str:*SESSDATA=!") do (
- endlocal
- echo %%b
- )
- )
- pause
复制代码
作者: 77七 时间: 2024-12-12 19:37
- @echo off
- cd /d "%~dp0"
- set /p str=<"1.txt"
- set "str=%str:;=&set %"
- set %str%
- echo %SESSDATA%
- pause
复制代码
作者: fzp070 时间: 2024-12-12 19:48
回复 4# 77七
非常感谢!完美解决!
我太弱了,"!str:*SESSDATA=!" 这种定位方法我都不知道。
作者: fzp070 时间: 2024-12-12 19:53
回复 5# 77七
5楼代码也通过,更精简了,感谢大神!
作者: aloha20200628 时间: 2024-12-12 20:02
本帖最后由 aloha20200628 于 2024-12-14 20:28 编辑
回复 1# fzp070
另一个版本...- @echo off & setlocal
-
- set "line=CURRENT_BLACKGAP=Z...3; hit-dyn-v2=Z...3; FEED_LIVE_VERSION=Z...3; LIVE_BUVID=Z...3; PVID=Z...3; rpdid=Z...3; buvid_fp_plain=Z...3; buvid_fp=Z...3; buvid4=Z...3; _uuid=Z...3; fingerprint=Z...3; bmg_af_switch=Z...3; CURRENT_QUALITY=Z...3; bmg_src_def_domain=Z...3; browser_resolution=Z...3; enable_web_push=Z...3; header_theme_version=Z...3; home_feed_column=Z...3; b_nut=Z...3; buvid3=Z...3; bsource_origin=Z...3; bmg_af_switch=Z...3; bmg_src_def_domain=Z...3; share_source_origin=Z...3; bili_ticket=Z...3; bili_ticket_expires=Z...3; DedeUserID=Z...3; DedeUserID__ckMd5=Z...3; SESSDATA=167.......0C; bili_jct=Z...3; sid=Z...3; bp_t_offset_330614218=Z...3; CURRENT_FNVAL=Z...3; b_lsid=Z...3; bsource=Z...3"
-
- setlocal enabledelayedexpansion &set "go=1" &set "ok="
- for %%a in (!line!) do if defined go if /i "%%a"=="SESSDATA" (set/a "ok=1") else if defined ok (set "go=" &set "v=%%a")
- echo,SESSDATA=!v!&pause&exit/b
复制代码
作者: aloha20200628 时间: 2024-12-12 20:16
本帖最后由 aloha20200628 于 2024-12-13 09:59 编辑
回复 3# fzp070
用 grep.exe 更直截了当... (本坛第三方下载 grep.exe 落地即用 http://bcn.bathome.net/s/tool/index.html?key=grep)- @echo off & setlocal
- set "line=CURRENT_BLACKGAP=Z...3; hit-dyn-v2=Z...3; FEED_LIVE_VERSION=Z...3; LIVE_BUVID=Z...3; PVID=Z...3; rpdid=Z...3; buvid_fp_plain=Z...3; buvid_fp=Z...3; buvid4=Z...3; _uuid=Z...3; fingerprint=Z...3; bmg_af_switch=Z...3; CURRENT_QUALITY=Z...3; bmg_src_def_domain=Z...3; browser_resolution=Z...3; enable_web_push=Z...3; header_theme_version=Z...3; home_feed_column=Z...3; b_nut=Z...3; buvid3=Z...3; bsource_origin=Z...3; bmg_af_switch=Z...3; bmg_src_def_domain=Z...3; share_source_origin=Z...3; bili_ticket=Z...3; bili_ticket_expires=Z...3; DedeUserID=Z...3; DedeUserID__ckMd5=Z...3; SESSDATA=167.......0C; bili_jct=Z...3; sid=Z...3; bp_t_offset_330614218=Z...3; CURRENT_FNVAL=Z...3; b_lsid=Z...3; bsource=Z...3"
-
- echo,"%line%"|grep -o "SESSDATA=[^;]*"
-
- pause&exit/b
复制代码
作者: fzp070 时间: 2024-12-12 20:52
回复 5# 77七
刚应用在实际中时,发现5楼方法不太稳定,换了个文本内容,程序就闪退了。而且原文本最后加个;,也会出错。
4楼方法稳定没问题。有这个就可以了。
作者: fzp070 时间: 2024-12-12 21:18
本帖最后由 fzp070 于 2024-12-12 21:54 编辑
回复 8# aloha20200628
8楼的代码直接运行是可以的,但实际运用中,发现也有问题,遇到内容中含|符号时,会获取不到或闪退,跟5楼问题一样。
9楼的代码已试OK,代码很精简,不错。
感谢大佬指导!
作者: 77七 时间: 2024-12-12 22:02
本帖最后由 77七 于 2024-12-12 22:03 编辑
回复 10# fzp070
可添加引号转义特殊字符,但是不知道还会不会有其它问题,总之,对于 简单文本,可以利用5楼实现快速赋值。- (set "str=%str:;="&set "%") 1>nul
复制代码
如下代码 字符串含有特殊字符, echo %字符串% 会引起闪退
需开启变量延迟扩展再 echo
- set "str=|"
- setlocal enabledelayedexpansion
- echo !str!
复制代码
作者: fzp070 时间: 2024-12-12 22:55
回复 12# 77七
感谢大佬指教!
刚试了下,按大佬说的操作,如果是以1楼字符,加上;或者加上|,都是可以。但以实际获得的字符,还是不行,获取为空。不过不再闪退。
不过,发现用for来获取文本,替换大佬set /p 方戒获取文本代码,反而可以了。见下
另外8楼代码,通过增加setlocal enabledelayedexpansion,也不闪退了。问题目前来看是解决了。- @echo off
- cd /d "%~dp0"
-
- ::set /p str=<"test2.txt"&rem ---------------------------------------------------------此代码舍弃
- for /f "tokens=*" %%a in (test2.txt) do (set "str=%%a") &rem -------------------------------【换成此】
- ::set "str=%str:;=&set %"&rem -------------------------------------------------------此代码舍弃
- (set "str=%str:;="&set "%") 1>nul
- setlocal enabledelayedexpansion
- set !str!
- ::echo !SESSDATA!
- set cookie_SESSDATA=SESSDATA=!SESSDATA!;
- echo !cookie_SESSDATA!
- echo !cookie_SESSDATA!>cookie3.txt
- TIMEOUT /T 3 /NOBREAK
- exit
复制代码
作者: aloha20200628 时间: 2024-12-13 09:45
本帖最后由 aloha20200628 于 2024-12-14 20:31 编辑
回复 11# fzp070
如果一楼示例字符串中包含 |& 等cmd转义字符,须用双引号包裹字符串变量 line 赋值表达式,须用双引号包裹 echo 输出数据,须将 for %%a in (%line%) ... 句式改为变量延迟句式以便逃逸 cmd 对 %line% 的预处理... 据此已订正8楼代码。
如果源数据被存入文本文件(假定为 1.txt)且只有一行,可用以下版本- @echo off &setlocal &set "go=1" &set "ok="
- for /f "delims=" %%a in (1.txt) do for %%x in (%%a) do if defined go if /i "%%x"=="SESSDATA" (set/a "ok=1") else if defined ok (set "go=" &set "v=%%x")
- set/p="SESSDATA=%v%"<nul&echo,&pause&exit/b
复制代码
若用 grep 一行流则可提取出 1.txt 中每行(若不止一行数据)的目标字段 "SESSDATA=...",并可定向输出到 2.txt- type "1.txt"|grep -o "SESSDATA=[^;]*">"2.txt"
复制代码
作者: fzp070 时间: 2024-12-13 09:53
回复 14# aloha20200628
感谢大佬详细指导,问题昨天都解决了,至少当前遇到的COOKie字符是没问题了。
昨天在 @77七 大神的指导下,用了 setlocal enabledelayedexpansion就可以,之前没用这变量延迟,只用双引号包括试了是不行的。grep一直都没问题。
再次感谢两位大才的热心指导。
作者: hfxiang 时间: 2024-12-13 10:18
回复 1# fzp070
也可以试试gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe )- gawk -v"RS=(\r?\n| |;)+" "/^SESSDATA=/" test.txt>output.txt
复制代码
作者: fzp070 时间: 2024-12-14 15:31
回复 16# hfxiang
感谢提供新方法,试了下可以。但最后缺个;号,要怎么增加呢?
作者: aloha20200628 时间: 2024-12-14 20:44
回复 15# fzp070
8楼代码已订正,因已采用变量延迟故将%v%改为!v!即可取消双引号,也不怕其中包含 &| 等特殊字符 '作祟'。
14楼代码因全程未用延迟变量,故须改用 set/p="SESSDATA=%v%"<nul&echo, 句式,以避免其中可能包含的特殊字符 '作祟' ...
作者: hfxiang 时间: 6 天前 19:06
回复 17# fzp070
试试- gawk -v"ORS=;\r\n" -v"RS=(\r?\n| |;)+" "/^SESSDATA=/" test.txt>output.txt
复制代码
作者: fzp070 时间: 3 天前 16:06
回复 19# hfxiang
可以了,非常感谢!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |