[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何将文件指定字符后面的所有段落合并为一段?

请教各位老师,

有N个txt文件。每个文件至少包含一个特定的字符。

问题:如何将这个指定字符后面的所有段落内容合并为一段,指定字符前面的文本内容不做处理。

示例某一txt文件内容(“详细说明”为指定字符):

--------------------------------------------------

详细说明:

  在正常情况下,无线路由器和访问点都拥有防止未知的无线设备连接到网络的能力。
  这种功能是通过比较试图连接到路由器的设备MAC地址和路由器所保存设备的MAC地址而实现的。
  不过,不幸的是,在路由器出厂时这种特性通常是关闭的,因为这需要用户的一些努力才能使其正确工作,否则反而无法连接网络。因此,通过启用这种特性,并且只告诉路由器本单位或家庭中无线设备的MAC地址,我们就可以防止他人盗用自己的互联网连接,从而提升安全性。(文本末)
--------------------------------------------------

批处理的结果:
--------------------------------------------------
详细说明:在正常情况下,无线路由器和访问点都拥有防止未知的无线设备连接到网络的能力。  这种功能是通过比较试图连接到路由器的设备MAC地址和路由器所保存设备的MAC地址而实现的。  不过,不幸的是,在路由器出厂时这种特性通常是关闭的,因为这需要用户的一些努力才能使其正确工作,否则反而无法连接网络。因此,通过启用这种特性,并且只告诉路由器本单位或家庭中无线设备的MAC地址,我们就可以防止他人盗用自己的互联网连接,从而提升安全性。(文本末)
--------------------------------------------------

盼请高手拨刀相助,谢谢!

[ 本帖最后由 plues 于 2010-10-1 15:07 编辑 ]

表达不准确

你的每个txt文本里面 都以 "详细说明"字符 后面的内容为目标?

TOP

是的。如果偶尔有个txt文件不包含“详细说明”,那么跳过此文件即可,不用处理。

TOP

详细说明 后面的字数如果过多久不好处理了

TOP

确实存在这个问题。“详细说明”后面的字数各个txt均不同。最少的有几十个字符,最多的一个有15000字。
如果批处理无法处理太多的字符,就判断txt文件的大小(1K字节以内的占绝大多数,1~10k字节的较少),如果大于多少k就跳过处理,只处理字数较少的就行了,字数多的手动修改。

TOP

  1. sed -i "/^详细说明/,${:a; $!N; s/\n//; ta; P; D}" 1.txt
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (*.txt) do (
  3.   for /f "delims=:" %%a in ('findstr /n "详细说明:" "%%~i"') do set n=%%a&set nn=
  4.   for /f "tokens=1* delims=:" %%a in ('type "%%~i" ^| findstr /n .*^&del /s/q "%%~i"') do (
  5.   if %%a leq !n! (echo,%%b>>"%%~i") else (set nn=!nn!%%b)
  6.   )
  7.   echo,!nn!>>"%%~i"
  8. )
  9. set /p=处理完毕
复制代码

TOP

感谢CUer老师热情相助!

以下是执行错误信息,烦请再修正一下错误:
环境变量 -i "/^详细说明/,${:a; $!N; s/\n//; ta; P; D}" 没有定义

TOP

你有sed.exe吗?哪个版本?

TOP

先发个样本来看看。你的解释有点乱。

TOP

原意是有N个txt文件需要处理,而且只处理位于txt中关键字是“详细说明”后面的段落(至文件尾),“详细说明”前面的所有文本内容均不处理,保持原状。

可能是我问题叙述的不太清晰。发个示例文件及处理后的文件,供各位老师参考。

CUer老师的sed只能执行1个文件,输出结果是txt中所有段落都合并了。
yangfengoo老师的代码思路是对的。不足之处就是文本末的最后面多出了一行,打印出了文件的路径,可否去掉这个路径。另外,可否在“详细说明”后面直接跟着下面的段落内容?

谢谢几位老师的大力帮助!

[ 本帖最后由 plues 于 2010-9-30 16:54 编辑 ]

TOP

  1. sed -i "/^详细说明/,${:a; $!N; s/\n//; ta; P; D}" *.txt
复制代码

TOP

输出结果是txt中所有段落都合并了?你用的哪个版本的sed啊?

TOP

回CUer老师,sed 版本 4.1.5
输出不但所有段落都合并了,而且原文本的每行的在输出后就加了一个小小的黑色方块■

TOP

把 leq 改成 lss 就是了
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (*.txt) do (
  3.   for /f "delims=:" %%a in ('findstr /n "详细说明:" "%%~i"') do set n=%%a&set nn=
  4.   for /f "tokens=1* delims=:" %%a in ('type "%%~i" ^| findstr /n .*^&del /s/q "%%~i"') do (
  5.   if %%a leq !n! (echo,%%b>>"%%~i") else (set nn=!nn!%%b)
  6.   )
  7.   echo,!nn!>>"%%~i"
  8. )
  9. set /p=处理完毕
复制代码
怎么会多一行? 本地测试没问题

TOP

返回列表