Board logo

标题: [文本处理] 批处理如何从TXT文本中提取某个字符? [打印本页]

作者: fantasyhpu    时间: 2023-1-25 19:33     标题: 批处理如何从TXT文本中提取某个字符?

这个问题不知道怎么办,被堵住了。
这是一个txt文本:
  1. this is a test.
  2. COM6......
  3. The number 2463 tool is on COM6, wait...
复制代码
想提取出来“The number 2463 tool is on COM6”中,COM6中的“6”,将这个“6”显示在命令行窗口中,不知该怎么办?
系统是win10。
作者: 77七    时间: 2023-1-25 19:57

  1. @echo off
  2. for /f "tokens=7 delims=, " %%a in ('type 文本.txt ^| find "The number"') do (
  3. set str=%%a
  4. )
  5. echo %str:COM=%
  6. pause
复制代码

作者: hfxiang    时间: 2023-1-25 20:13

下载gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe
  1. gawk "/The number 2463 tool is on COM/{print gensub(/^The number 2463 tool is on COM(.).*$/,\"\\1\",\"g\")}" 文本.txt
复制代码

作者: fantasyhpu    时间: 2023-1-25 22:14

77七 发表于 2023-1-25 19:57


万分感谢,终于知道怎么办了。。。
感谢。
作者: fantasyhpu    时间: 2023-1-25 22:56

下载gawk(  )
hfxiang 发表于 2023-1-25 20:13

感谢提供gawk下载链接。感谢提供解答。
作者: fantasyhpu    时间: 2023-1-29 20:58

本帖最后由 fantasyhpu 于 2023-1-29 21:05 编辑
77七 发表于 2023-1-25 19:57


这几天在使用这段批处理时出现一个问题:
若“文本.txt”中的内容,昨天和今天的不一样,例如昨天的内容是:
  1. this is a test.
  2. COM6......
  3. The number 2463 tool is on COM6, wait...
复制代码
则用您给的方法找到了“The number 2463 tool is on COM6”中,COM后面的“6”。
但是今天“文本.txt”的内容变为:
  1. this is a test.
  2. this is another test.
  3. COM7......
  4. COM8......
  5. The number 2463 tool is on COM6, wait...
  6. this is another test.
复制代码
用原先的批处理时,就找不到COM6中的“6”了。

我尝试将
  1. for /f "tokens=7 delims=,
复制代码
中tokens的值从7改为其它值,比如6、3等,但治标不治本,只要“文本.txt”内容不一样了,就找不到COM6中的“6”了。
无论“文本.txt”中的内容如何更改,但是“The number 2463 tool is on COM”是永远存在的,对这种情况,怎样修改您给出的批处理程序,提取紧挨着“The number 2463 tool is on COM”后面的“6”呢?
感谢。。。
作者: 77七    时间: 2023-1-29 21:09

本帖最后由 77七 于 2023-1-29 21:26 编辑

回复 6# fantasyhpu

我这边测试正常
  1. 'type 文本.txt ^| find "The number"'
复制代码
意为:“打印” 包含 The number 的那一行




  1. "tokens=7 delims=, "
复制代码
意为:以“,”和“ ”(空格)分割,取第7个“字符串”



我把文本用引号括了一下,重新复制代码,
注意 批处理保存为ansi编码格式
  1. @echo off
  2. for /f "tokens=7 delims=, " %%a in ('type "文本.txt" ^| find "The number"') do (
  3.         set str=%%a
  4. )
  5. echo %str:COM=%
  6. pause
复制代码



如果还是不行,把你用的批处理和文本原件打包上传到网盘,我再来测试一下

21:26更新
  1. @echo off
  2. for /f "tokens=7 delims=, " %%a in ('type "文本.txt" ^| find "The number 2463 tool is on"') do (
  3. set str=%%a
  4. )
  5. echo %str:COM=%
  6. pause
复制代码


改成这样也行
作者: fantasyhpu    时间: 2023-1-29 22:23

回复  fantasyhpu

我这边测试正常意为:“打印” 包含 The number 的那一行




意为:以“,”和 ...
77七 发表于 2023-1-29 21:09



感谢。。。
我将测试文件放在了这里:
链接:https://pan.baidu.com/s/1OCWaAbMPQ_2vmn6gd2Q_Ug?pwd=1111
提取码:1111
作者: 77七    时间: 2023-1-29 22:31

本帖最后由 77七 于 2023-1-29 22:34 编辑

回复 8# fantasyhpu

你的文本行结束符有点问题,改为(CR+LF) 这个试试

批处理最好保存为ansi编码
作者: fantasyhpu    时间: 2023-1-30 15:17

本帖最后由 fantasyhpu 于 2023-1-30 15:22 编辑
回复  fantasyhpu

你的文本行结束符有点问题,改为(CR+LF) 这个试试

批处理最好保存为ansi编码
77七 发表于 2023-1-29 22:31


感谢提醒。经过反复对比,发现确实是文本行结束符有问题。正确的行结束符应该是CR+LF,但是本文中有些行结束符只为CR:

无法上传图片与附件,将图片传到这里了:
链接:https://pan.baidu.com/s/18SwGetmnjQ8ZY8hb_Adayg?pwd=1111
提取码:1111

请问对于这类有毛病的文本,有办法将”ATmega328P on COM“定位出来,提取出紧跟着它的那个字符”6“吗?
感谢。。。
作者: 77七    时间: 2023-1-30 17:15

本帖最后由 77七 于 2023-1-30 18:15 编辑

回复 10# fantasyhpu


   我也是第一次遇到这种状况,你的网盘文件删了,我没法测试,试试这样行不
  1. @echo off
  2. for /f "delims=" %%a in ('type "文本.txt" ^| find "ATmega328P on COM"') do (
  3.         set "str=%%a"
  4. )
  5. set "str=%str:*ATmega328P on COM=%"
  6. for /f "tokens=1" %%a in ("%str%") do (
  7.         set str=%%a
  8. )
  9. echo %str%
  10. pause
复制代码

作者: fantasyhpu    时间: 2023-1-30 18:56

回复  fantasyhpu


   我也是第一次遇到这种状况,你的网盘文件删了,我没法测试,试试这样行不
77七 发表于 2023-1-30 17:15


感谢您的回复。您的批处理代码完全解决了问题,对上面出问题的文本(行结束符不是CR+LF,而是CR)也能很好的找到期望的结果。
再次感谢。。。
作者: terse    时间: 2023-1-30 19:31

这样可行不
  1. @echo off
  2. for /f "delims=" %%a in ('findstr /ic:"The number 2463 tool is on COM"  1.txt') do set "str=%%a"
  3. for /f "delims=, " %%a in ("%str:*The number 2463 tool is on COM=%") do echo %%a
  4. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2