标题: [文本处理] [已解决]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,文本内容如下:- <第一行> <测试内容"倒数第十行">
- <第二行> <测试内容"倒数第九行">
- <第三行> <测试内容"倒数第八行">
- <第四行> <测试内容"倒数第七行">
- <第五行> <测试内容"倒数第六行">
- <第六行> <测试内容"倒数第五行">
- <第七行> <测试内容"倒数第四行">
- <第八行> <测试内容"倒数第三行">
- <第九行> <测试内容"倒数第二行">
- <第十行> <测试内容"倒数第一行">
复制代码
如果选定全部行,批量删除指定字符之间的内容
起始内容:<测试内容
结束内容:">
得到的结果就是下面的
<第一行>
<第二行>
<第三行>
<第四行>
<第五行>
<第六行>
<第七行>
<第八行>
<第九行>
<第十行>
作者: xxpinqz 时间: 2014-3-9 17:08
看起来有点工作量啊,飘过。。。
作者: apang 时间: 2014-3-9 17:36
本帖最后由 apang 于 2014-3-9 23:41 编辑
- Dim strPrompt, Input
- strPrompt = "1:指定顺数单行" & vbLf & "2:指定顺数多行" & vbLf & _
- "3:指定倒数单行" & vbLf & "4:指定倒数多行" & vbLf & _
- "5:删除指定内容" & vbLf & vbLf & "输入[1-5]"
- Input = GetInput(strPrompt, "", "1", "[1-5]")
-
- Dim s, Pattern, a, b, s1, s2, ar, ss
- If Input = "1" Then
- strPrompt = "输入指定行:"
- s = GetInput(strPrompt,"指定顺数单行","1","[1-9]\d*")
- Pattern = "((.*\n){" & s-1 & "}).*\n([\s\S]*)"
-
- ElseIf Input = "2" Then
- strPrompt = "输入起始行和结束行,空格隔开:"
- s = GetInput(strPrompt,"指定顺数多行","1 2","[1-9]\d* +[1-9]\d*")
- a = Left(s, InStr(s, " ")-1)
- b = Right(s, Len(s) - InStrRev(s, " "))
- Pattern = "^((.*\n){" & a-1 & "})(.*\n){" & b-a+1 & "}([\s\S]*)$"
-
- ElseIf Input = "3" Then
- strPrompt = "输入指定行:"
- s = GetInput(strPrompt,"指定倒数单行","1","[1-9]\d*")
- Pattern = "^([\s\S]*?)(.*\n)((.*\n){" & s-1 & "})$"
-
- ElseIf Input = "4" Then
- strPrompt = "输入起始行和结束行,空格隔开:"
- s = GetInput(strPrompt,"指定倒数多行","1 2","[1-9]\d* +[1-9]\d*")
- a = Left(s, InStr(s, " ")-1)
- b = Right(s, Len(s) - InStrRev(s, " "))
- Pattern = "^([\s\S]*?)(.*\n){" & b-a+1 & "}((.*\n){" & a-1 & "})$"
-
- Else
- strPrompt = "1:删除指定字符之前的内容" & vbLf & _
- "2:删除指定字符之间的内容" & vbLf & _
- "3:删除指定字符之后的内容" & vbLf & vbLf & "输入[1-3]"
- ar = Array("\",".","*","?","$","(",")","^","|","+","{","[")
- ss = GetInput(strPrompt,"删除指定内容","1","[1-3]")
-
- If ss = "1" Then
- strPrompt = "输入指定字符:" & vbLf & vbLf & _
- "最大匹配不删除指定字符"
- s = GetInput(strPrompt,"删除指定字符之前的内容","A",".+")
- For i = 0 to UBound(ar)
- s = Replace(s, ar(i), "\" & ar(i))
- Next
- Pattern = "[\s\S]*(" & s & ")"
-
- ElseIf ss = "2" Then
- strPrompt = "输入起始字符:" & vbLf & vbLf & _
- "最小匹配不删除起始、结束字符"
- s1 = GetInput(strPrompt,"删除指定字符之间的内容","A",".+")
- strPrompt = "输入结束字符:"
- s2 = GetInput(strPrompt,"删除指定字符之间的内容","B",".+")
- For i = 0 to UBound(ar)
- s1 = Replace(s1, ar(i), "\" & ar(i))
- s2 = Replace(s2, ar(i), "\" & ar(i))
- Next
- Pattern = "(" & s1 & ")[\s\S]*?(" & s2 & ")"
-
- Else
- strPrompt = "输入指定字符:" & vbLf & vbLf & _
- "最大匹配不删除指定字符"
- s = GetInput(strPrompt,"删除指定字符之后的内容","A",".+")
- For i = 0 to UBound(ar)
- s = Replace(s, ar(i), "\" & ar(i))
- Next
- Pattern = "(" & s & ")[\s\S]*"
- End If
- End If
-
- Dim fso, file, txt
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each file in fso.GetFolder(".").Files
- If LCase(Right(file.Name,4)) = ".txt" Then
- txt = fso.OpenTextFile(file, 1).ReadAll
- If Right(txt,2) <> vbCrLf Then txt = txt & vbCrLf
- fso.OpenTextFile(file, 2).Write RegEx(txt, Pattern)
- End If
- Next
-
- MsgBox "OK"
-
- Function RegEx(str, Pattern)
- Dim re
- Set re = New RegExp
- re.Pattern = Pattern
- If Input = "5" Then
- re.IgnoreCase = True
- If ss = "2" Then
- re.Global = True
- RegEx = re.Replace(str,"$1$2")
- Else RegEx = re.Replace(str,"$1")
- End If
- ElseIf Input = "2" Then RegEx = re.Replace(str,"$1$4")
- Else RegEx = re.Replace(str,"$1$3")
- End If
- End Function
-
- Function GetInput(strPrompt, strTitle, strDefault, strPattern)
- Dim Input1
- Do while true
- Input1 = InputBox(strPrompt, strTitle, strDefault)
- If IsEmpty(Input1) Then WScript.Quit
- If IsValidInput(CStr(Input1),strPattern) Then Exit Do
- Loop
- GetInput = Input1
- End Function
-
- Function IsValidInput(strInput, Pattern)
- Dim re
- Set re = New RegExp
- re.Pattern = "^" & Pattern & "$"
- If re.Test(strInput) Then IsValidInput = true
- 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 - Dim strPrompt, strPrompt1, Input, strTitle
- Dim s, startLine, endLine, s1, s2, i, ar, Pattern
- strPrompt = "1:指定顺数单行操作" & vbLf & _
- "2:指定顺数多行操作" & vbLf & vbLf & "输入[1-2]"
-
- Input = GetInput(strPrompt, "", "1", "[1-2]")
-
- strPrompt = "1:删除指定字符之前的内容" & vbLf & _
- "2:删除指定字符之间的内容" & vbLf & _
- "3:删除指定字符之后的内容" & vbLf & vbLf & _
- "最大匹配不删除指定字符" & vbLf & "输入[1-3]"
-
- If Input = "1" Then
- strTitle = "指定顺数单行操作"
- s = GetInput("输入指定行:", strTitle, "1", "[1-9]\d*")
- startLine = s : endLine = s
- s = GetInput(strPrompt, strTitle, "1", "[1-3]")
- Else
- strTitle = "指定顺数多行操作"
- strPrompt1 = "输入起始行、结束行" & vbLf & vbLf & _
- "空格隔开:"
- s = GetInput(strPrompt1,strTitle,"1 2","[1-9]\d* [1-9]\d*")
- startLine = Split(s, " ")(0)
- endLine = Split(s, " ")(1)
- s = GetInput(strPrompt, strTitle, "1", "[1-3]")
- End If
-
- ar = Array("\",".","*","?","$","(",")","^","|","+","{","[")
- If s = "1" Then
- strPrompt = "删除指定字符之前的内容" & vbLf & vbLf & _
- "输入指定字符:"
- s1 = GetInput(strPrompt, strTitle, "A", ".+")
- For i = 0 to UBound(ar)
- s1 = Replace(s1, ar(i), "\" & ar(i))
- Next
- Pattern = "^.*(" & s1 & ")(.*)$"
-
- ElseIf s = "2" Then
- strPrompt = "删除指定字符之间的内容" & vbLf & vbLf & _
- "输入起始字符:"
- s1 = GetInput(strPrompt, strTitle, "A", ".+")
- strPrompt = "删除指定字符之间的内容" & vbLf & vbLf & _
- "输入结束字符:"
- s2 = GetInput(strPrompt, strTitle, "B", ".+")
- For i = 0 to UBound(ar)
- s1 = Replace(s1, ar(i), "\" & ar(i))
- s2 = Replace(s2, ar(i), "\" & ar(i))
- Next
- Pattern = "^(.*?" & s1 & ").*(" & s2 & ".*)$"
-
- Else
- strPrompt = "删除指定字符之后的内容" & vbLf & vbLf & _
- "输入指定字符:"
- s1 = GetInput(strPrompt, strTitle, "A", ".+")
- For i = 0 to UBound(ar)
- s1 = Replace(s1, ar(i), "\" & ar(i))
- Next
- Pattern = "^(.*?)(" & s1 & ").*$"
- End If
-
- Dim fso, file, txt, arrTxt
- Set fso = CreateObject("Scripting.FileSystemObject")
- For Each file in fso.GetFolder(".").Files
- If LCase(Right(file,4)) = ".txt" Then
- txt = fso.OpenTextFile(file, 1).ReadAll
- If Right(txt,2) <> vbCrLf Then txt = txt & vbCrLf
- arrTxt = Split(txt, vbCrLf)
- If UBound(arrTxt) >= endLine - 1 Then
- For i = startLine -1 to endLine - 1
- arrTxt(i) = RegEx(arrTxt(i))
- Next
- End If
- fso.OpenTextFile(file, 2).Write Join(arrTxt,vbCrLf)
- End If
- Next
-
- MsgBox "OK"
-
- Function RegEx(str)
- Dim re
- Set re = New RegExp
- re.Pattern = Pattern
- re.IgnoreCase = True
- re.Global = True
- RegEx = re.Replace(str,"$1$2")
- End Function
-
- Function GetInput(strPrompt, strTitle, strDefault, strPattern)
- Dim Input1
- Do while true
- Input1 = InputBox(strPrompt, strTitle, strDefault)
- If IsEmpty(Input1) Then WScript.Quit
- If IsValidInput(CStr(Input1),strPattern) Then Exit Do
- Loop
- GetInput = Input1
- End Function
-
- Function IsValidInput(strInput, strPattern)
- Dim re
- Set re = New RegExp
- re.Pattern = "^" & strPattern & "$"
- If re.Test(strInput) Then IsValidInput = true
- End function
复制代码
倒数:将代码中的“顺数”改成“倒数”,然后把上面69-71行的for循环这样改:- For i = startLine to endLine
- j = UBound(arrTxt) - i
- If j>=0 Then arrTxt(j) = RegEx(arrTxt(j))
- Next
复制代码
作者: xp3000 时间: 2014-3-11 20:52
本帖最后由 xp3000 于 2014-3-13 17:18 编辑
谢谢,能用,如果有空把4楼整理下,需要顺数和倒数的两个vbs代码,弄成输入的字符也删除的。
作者: 34205 时间: 2015-7-19 14:01
楼主;你要继续努力啊!你是论坛的希望啊
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |