Board logo

标题: [文本处理] [已解决]BAT怎样批量删除指定行的指定字符之前、之间、之后的内容? [打印本页]

作者: xp3000    时间: 2014-3-9 11:01     标题: [已解决]BAT怎样批量删除指定行的指定字符之前、之间、之后的内容?

本帖最后由 xp3000 于 2015-6-24 14:21 编辑

比如要处理1000个文本,在需要处理的目录建个批处理,运行后出现5个选项,
每个选项里面又有子选项,提示需要执行内容的所在行:
1:指定顺数单行操作
2:指定顺数多行操作
3:指定倒数单行操作
4:指定倒数多行操作
5:指定全部内容操作

如果是多行,比如顺数,有输入提示:请输入起始行数:和请输入结束行数:
比如倒数,有输入提示:请输入倒数起始行数:和请输入倒数结束行数:
可以在里面输入数字,回车进入下个窗口。

1:删除指定字符之前的内容
2:删除指定字符之间的内容
3:删除指定字符之后的内容

选定后回车进入下个窗口,在里面提示需要输入的内容,
并且可以在窗口用键盘打字输入需要处理的内容。

比如选择的是“删除指定字符之间的内容”,
进入子选项窗口后,提示:请输入起始内容:
用键盘打字或粘贴内容后回车,提示:请输入结束内容:
打字输入内容或粘贴内容后后回车执行
作者: xp3000    时间: 2014-3-9 11:14

比如下面有个测试TXT,文本内容如下:
  1. <第一行> <测试内容"倒数第十行">
  2. <第二行> <测试内容"倒数第九行">
  3. <第三行> <测试内容"倒数第八行">
  4. <第四行> <测试内容"倒数第七行">
  5. <第五行> <测试内容"倒数第六行">
  6. <第六行> <测试内容"倒数第五行">
  7. <第七行> <测试内容"倒数第四行">
  8. <第八行> <测试内容"倒数第三行">
  9. <第九行> <测试内容"倒数第二行">
  10. <第十行> <测试内容"倒数第一行">
复制代码
如果选定全部行,批量删除指定字符之间的内容
起始内容:<测试内容
结束内容:">
得到的结果就是下面的
<第一行>
<第二行>
<第三行>
<第四行>
<第五行>
<第六行>
<第七行>
<第八行>
<第九行>
<第十行>
作者: xxpinqz    时间: 2014-3-9 17:08

看起来有点工作量啊,飘过。。。
作者: apang    时间: 2014-3-9 17:36

本帖最后由 apang 于 2014-3-9 23:41 编辑
  1. Dim strPrompt, Input
  2. strPrompt = "1:指定顺数单行" & vbLf & "2:指定顺数多行" & vbLf & _
  3.             "3:指定倒数单行" & vbLf & "4:指定倒数多行" & vbLf & _
  4.             "5:删除指定内容" & vbLf & vbLf & "输入[1-5]"
  5. Input = GetInput(strPrompt, "", "1", "[1-5]")
  6. Dim s, Pattern, a, b, s1, s2, ar, ss
  7. If Input = "1" Then
  8.     strPrompt = "输入指定行:"
  9.     s = GetInput(strPrompt,"指定顺数单行","1","[1-9]\d*")
  10.     Pattern = "((.*\n){" & s-1 & "}).*\n([\s\S]*)"
  11. ElseIf Input = "2" Then
  12.     strPrompt = "输入起始行和结束行,空格隔开:"
  13.     s = GetInput(strPrompt,"指定顺数多行","1 2","[1-9]\d* +[1-9]\d*")
  14.     a = Left(s, InStr(s, " ")-1)
  15.     b = Right(s, Len(s) - InStrRev(s, " "))
  16.     Pattern = "^((.*\n){" & a-1 & "})(.*\n){" & b-a+1 & "}([\s\S]*)$"
  17. ElseIf Input = "3" Then
  18.     strPrompt = "输入指定行:"
  19.     s = GetInput(strPrompt,"指定倒数单行","1","[1-9]\d*")
  20.     Pattern = "^([\s\S]*?)(.*\n)((.*\n){" & s-1 & "})$"
  21. ElseIf Input = "4" Then
  22.     strPrompt = "输入起始行和结束行,空格隔开:"
  23.     s = GetInput(strPrompt,"指定倒数多行","1 2","[1-9]\d* +[1-9]\d*")
  24.     a = Left(s, InStr(s, " ")-1)
  25.     b = Right(s, Len(s) - InStrRev(s, " "))
  26.     Pattern = "^([\s\S]*?)(.*\n){" & b-a+1 & "}((.*\n){" & a-1 & "})$"
  27. Else
  28.     strPrompt = "1:删除指定字符之前的内容" & vbLf & _
  29.                 "2:删除指定字符之间的内容" & vbLf & _
  30.                 "3:删除指定字符之后的内容" & vbLf & vbLf & "输入[1-3]"
  31.     ar = Array("\",".","*","?","$","(",")","^","|","+","{","[")
  32.     ss = GetInput(strPrompt,"删除指定内容","1","[1-3]")
  33.     If ss = "1" Then
  34.         strPrompt = "输入指定字符:" & vbLf & vbLf & _
  35.                     "最大匹配不删除指定字符"
  36.         s = GetInput(strPrompt,"删除指定字符之前的内容","A",".+")
  37.         For i = 0 to UBound(ar)
  38.             s = Replace(s, ar(i), "\" & ar(i))
  39.         Next
  40.         Pattern = "[\s\S]*(" & s & ")"
  41.     ElseIf ss = "2" Then
  42.         strPrompt = "输入起始字符:" & vbLf & vbLf & _
  43.                     "最小匹配不删除起始、结束字符"
  44.         s1 = GetInput(strPrompt,"删除指定字符之间的内容","A",".+")
  45.         strPrompt = "输入结束字符:"
  46.         s2 = GetInput(strPrompt,"删除指定字符之间的内容","B",".+")
  47.         For i = 0 to UBound(ar)
  48.             s1 = Replace(s1, ar(i), "\" & ar(i))
  49.             s2 = Replace(s2, ar(i), "\" & ar(i))
  50.         Next
  51.         Pattern = "(" & s1 & ")[\s\S]*?(" & s2 & ")"
  52.     Else
  53.         strPrompt = "输入指定字符:" & vbLf & vbLf & _
  54.                     "最大匹配不删除指定字符"
  55.         s = GetInput(strPrompt,"删除指定字符之后的内容","A",".+")
  56.         For i = 0 to UBound(ar)
  57.             s = Replace(s, ar(i), "\" & ar(i))
  58.         Next
  59.         Pattern = "(" & s & ")[\s\S]*"
  60.     End If
  61. End If
  62. Dim fso, file, txt
  63. Set fso = CreateObject("Scripting.FileSystemObject")
  64. For Each file in fso.GetFolder(".").Files
  65.     If LCase(Right(file.Name,4)) = ".txt" Then
  66.         txt = fso.OpenTextFile(file, 1).ReadAll
  67.         If Right(txt,2) <> vbCrLf Then txt = txt & vbCrLf
  68.         fso.OpenTextFile(file, 2).Write RegEx(txt, Pattern)
  69.     End If
  70. Next
  71. MsgBox "OK"
  72. Function RegEx(str, Pattern)
  73.     Dim re
  74.     Set re = New RegExp
  75.     re.Pattern = Pattern
  76.     If Input = "5" Then
  77.         re.IgnoreCase = True
  78.         If ss = "2" Then
  79.             re.Global = True
  80.             RegEx = re.Replace(str,"$1$2")
  81.         Else RegEx = re.Replace(str,"$1")
  82.         End If
  83.     ElseIf Input = "2" Then RegEx = re.Replace(str,"$1$4")
  84.     Else RegEx = re.Replace(str,"$1$3")
  85.     End If
  86. End Function
  87. Function GetInput(strPrompt, strTitle, strDefault, strPattern)
  88.     Dim Input1
  89.     Do while true
  90.         Input1 = InputBox(strPrompt, strTitle, strDefault)
  91.         If IsEmpty(Input1) Then WScript.Quit
  92.         If IsValidInput(CStr(Input1),strPattern) Then Exit Do
  93.     Loop
  94.     GetInput = Input1
  95. End Function
  96. Function IsValidInput(strInput, Pattern)
  97.     Dim re
  98.     Set re = New RegExp
  99.     re.Pattern = "^" & Pattern & "$"
  100.     If re.Test(strInput) Then IsValidInput = true
  101. End function
复制代码

作者: xp3000    时间: 2014-3-9 18:03

回复 4# apang

谢谢,VBS后缀能用,这个基本解决了别人以后所有提出的类似问题
    如果要保留输入的内容,删除字符之间的,需要修改哪里?
比如删除指定字符之间的内容:
起始内容:行> <
结束内容:"倒数第

得到的是下面的结果:

<第一行> <"倒数第十行">
<第二行> <"倒数第九行">
<第三行> <"倒数第八行">
<第四行> <"倒数第七行">
<第五行> <"倒数第六行">
<第六行> <"倒数第五行">
<第七行> <"倒数第四行">
<第八行> <"倒数第三行">
<第九行> <"倒数第二行">
<第十行> <"倒数第一行">
作者: apang    时间: 2014-3-9 18:45

回复 5# xp3000


47行:
Pattern = "(" & s1 & ")[\s\S]*?(" & s2 & ")"

69行:
RegEx = re.Replace(str,"$1$2")
作者: xp3000    时间: 2014-3-9 22:07

本帖最后由 xp3000 于 2014-3-10 09:53 编辑

回复 4# apang


    发现个问题,指定行后面的内容成了删除指定行。如果解决就完美了。
删除指定行的指定内容,其他行没有选定就不会删除
作者: apang    时间: 2014-3-9 23:44

回复 7# xp3000


    4#改了,想100%通用是不可能的,试一下。
作者: xp3000    时间: 2014-3-10 10:19

本帖最后由 xp3000 于 2014-3-10 10:24 编辑

需要这个批处理的目的是因为有一大堆电子书,有的有上千章,排版不一,
有的有两个标题,而且有的章数没用括弧,有的又用了,而且有的首行有空行,
所以需要一个锁定行数操作的功能,需要删除的内容在这个锁定行内操作,
…… 这些省略号后面的都是小说内容,如果选择删除选定内容之后的
请输入删除指定字符之后的内容: 新书推荐
就会把重要的小说内容删除掉,而且小说结尾还有求票,感悟等,行数不统一,
如果删除一整行行,就没有文章标题了,所以需要一个只在指定行删除指定字符的批处理。

001.txt
第一卷 孤岛求生记 【内容简介】:……

【第一章】 勇斗魔狼 新书推荐《一剑傲九天》类型:玄幻·异界,作者:安简兮
…………

002.txt
第二章 荒岛大采购 新书推荐《鬼眼契约》 类型:都市·异能,作者:枪客
…………

003.txt
【第三章】 救了一个狐狸精 新书推荐《武界传说》类型:武侠,作者:天堂的森林
【第三章 】救了一个狐狸精
…………
作者: apang    时间: 2014-3-10 13:58

本帖最后由 apang 于 2014-3-11 00:13 编辑

原来是指定行的指定字符,不是整篇文档的。

再仔细看,主选项5个,子选项3个,相当于把15个不同的代码整合在一起。仅输入信息的显示、判断就占代码相当大的部分

个人认为这样的整合即使能实现,代码也很冗长,通用性不一定高,还不如单个功能的代码实用

我放弃
作者: xp3000    时间: 2014-3-11 04:20

回复 10# apang


    确实比较复杂,弄成功了就通用了,看来是了不能实现了.
能不能把这个想法做成两个VBS实现?要删除包括输入字符的。

第一个功能是指定行的指定字符删除,内容是
1:指定顺数单行操作
2:指定顺数多行操作
1和2的子窗口都能进入下面的功能:
1:删除指定字符之前的内容
2:删除指定字符之间的内容
3:删除指定字符之后的内容

第二个功能是倒数指定行的指定字符删除,内容是
1:指定倒数单行操作
2:指定倒数多行操作
1和2的子窗口也能进入下面的功能:
1:删除指定字符之前的内容
2:删除指定字符之间的内容
3:删除指定字符之后的内容
作者: apang    时间: 2014-3-11 16:33

回复 11# xp3000
  1. Dim strPrompt, strPrompt1, Input, strTitle
  2. Dim s, startLine, endLine, s1, s2, i, ar, Pattern
  3. strPrompt = "1:指定顺数单行操作" & vbLf & _
  4.             "2:指定顺数多行操作" & vbLf & vbLf & "输入[1-2]"
  5. Input = GetInput(strPrompt, "", "1", "[1-2]")
  6. strPrompt = "1:删除指定字符之前的内容" & vbLf & _
  7.             "2:删除指定字符之间的内容" & vbLf & _
  8.             "3:删除指定字符之后的内容" & vbLf & vbLf & _
  9.             "最大匹配不删除指定字符" & vbLf & "输入[1-3]"
  10. If Input = "1" Then
  11.     strTitle = "指定顺数单行操作"
  12.     s = GetInput("输入指定行:", strTitle, "1", "[1-9]\d*")
  13.     startLine = s : endLine = s
  14.     s = GetInput(strPrompt, strTitle, "1", "[1-3]")
  15. Else
  16.     strTitle = "指定顺数多行操作"
  17.     strPrompt1 = "输入起始行、结束行" & vbLf & vbLf & _
  18.                  "空格隔开:"
  19.     s = GetInput(strPrompt1,strTitle,"1 2","[1-9]\d* [1-9]\d*")
  20.     startLine = Split(s, " ")(0)
  21.     endLine = Split(s, " ")(1)
  22.     s = GetInput(strPrompt, strTitle, "1", "[1-3]")
  23. End If
  24. ar = Array("\",".","*","?","$","(",")","^","|","+","{","[")
  25. If s = "1" Then
  26.     strPrompt = "删除指定字符之前的内容" & vbLf & vbLf & _
  27.                 "输入指定字符:"
  28.     s1 = GetInput(strPrompt, strTitle, "A", ".+")
  29.     For i = 0 to UBound(ar)
  30.         s1 = Replace(s1, ar(i), "\" & ar(i))
  31.     Next
  32.     Pattern = "^.*(" & s1 & ")(.*)$"
  33. ElseIf s = "2" Then
  34.     strPrompt = "删除指定字符之间的内容" & vbLf & vbLf & _
  35.                 "输入起始字符:"
  36.     s1 = GetInput(strPrompt, strTitle, "A", ".+")
  37.     strPrompt = "删除指定字符之间的内容" & vbLf & vbLf & _
  38.                 "输入结束字符:"
  39.     s2 = GetInput(strPrompt, strTitle, "B", ".+")
  40.     For i = 0 to UBound(ar)
  41.         s1 = Replace(s1, ar(i), "\" & ar(i))
  42.         s2 = Replace(s2, ar(i), "\" & ar(i))
  43.     Next
  44.     Pattern = "^(.*?" & s1 & ").*(" & s2 & ".*)$"
  45. Else
  46.     strPrompt = "删除指定字符之后的内容" & vbLf & vbLf & _
  47.                 "输入指定字符:"
  48.     s1 = GetInput(strPrompt, strTitle, "A", ".+")
  49.     For i = 0 to UBound(ar)
  50.         s1 = Replace(s1, ar(i), "\" & ar(i))
  51.     Next
  52.     Pattern = "^(.*?)(" & s1 & ").*$"
  53. End If
  54. Dim fso, file, txt, arrTxt
  55. Set fso = CreateObject("Scripting.FileSystemObject")
  56. For Each file in fso.GetFolder(".").Files
  57.     If LCase(Right(file,4)) = ".txt" Then
  58.         txt = fso.OpenTextFile(file, 1).ReadAll
  59.         If Right(txt,2) <> vbCrLf Then txt = txt & vbCrLf
  60.         arrTxt = Split(txt, vbCrLf)
  61.         If UBound(arrTxt) >= endLine - 1 Then
  62.             For i = startLine -1 to endLine - 1
  63.                 arrTxt(i) = RegEx(arrTxt(i))
  64.             Next
  65.         End If
  66.         fso.OpenTextFile(file, 2).Write Join(arrTxt,vbCrLf)
  67.     End If
  68. Next
  69. MsgBox "OK"
  70. Function RegEx(str)
  71.     Dim re
  72.     Set re = New RegExp
  73.     re.Pattern = Pattern
  74.     re.IgnoreCase = True
  75.     re.Global = True
  76.     RegEx = re.Replace(str,"$1$2")
  77. End Function
  78. Function GetInput(strPrompt, strTitle, strDefault, strPattern)
  79.     Dim Input1
  80.     Do while true
  81.         Input1 = InputBox(strPrompt, strTitle, strDefault)
  82.         If IsEmpty(Input1) Then WScript.Quit
  83.         If IsValidInput(CStr(Input1),strPattern) Then Exit Do
  84.     Loop
  85.     GetInput = Input1
  86. End Function
  87. Function IsValidInput(strInput, strPattern)
  88.     Dim re
  89.     Set re = New RegExp
  90.     re.Pattern = "^" & strPattern & "$"
  91.     If re.Test(strInput) Then IsValidInput = true
  92. End function
复制代码
倒数:将代码中的“顺数”改成“倒数”,然后把上面69-71行的for循环这样改:
  1.             For i = startLine to endLine
  2.                 j = UBound(arrTxt) - i
  3.                 If j>=0 Then arrTxt(j) = RegEx(arrTxt(j))
  4.             Next
复制代码

作者: xp3000    时间: 2014-3-11 20:52

本帖最后由 xp3000 于 2014-3-13 17:18 编辑

谢谢,能用,如果有空把4楼整理下,需要顺数和倒数的两个vbs代码,弄成输入的字符也删除的。
作者: 34205    时间: 2015-7-19 14:01

楼主;你要继续努力啊!你是论坛的希望啊




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