Board logo

标题: [文本处理] [已解决]批处理如何删除首次同时出现多个字符串的行? [打印本页]

作者: meiszp    时间: 2019-1-14 21:00     标题: [已解决]批处理如何删除首次同时出现多个字符串的行?

本帖最后由 meiszp 于 2019-1-21 21:40 编辑

文本里有多行同时包含“BENDE”和“LASTF ”字符串,希望删除首次同时出现这两个字符串的行。


贴个代码
  1. @echo off
  2. set "filename=test.txt"
  3. cd.>tmp$
  4. for /f "tokens=1* delims=:" %%a in ('findstr /n .* %filename%') do (
  5. echo "%%b"|findstr "LASTF"|findstr "BENDE">nul&& (set n=%%a&goto :next)
  6. echo.%%b >>tmp$
  7. )
  8. :next
  9. more +%n% %filename% >>tmp$
  10. move tmp$ %filename%
复制代码

作者: ivor    时间: 2019-1-14 22:39

本帖最后由 ivor 于 2019-1-15 17:13 编辑

  1. $filename = "C:\Users\mac\Desktop\a.txt"
  2. ([regex]$pattern='(?=.*BENDE)(?=.*LASTF).*\r?\n?').replace([IO.File]::ReadAllText($filename),'',1) | set-content $filename
复制代码

作者: yhcfsr    时间: 2019-1-15 12:31

本帖最后由 yhcfsr 于 2019-1-15 12:47 编辑

回复 2# ivor

想不到正则表达式也能调用replace方法.
还有许多函数不知道用法,不知道是不是姿势不对,帮助文档没给我多少帮助.
求大佬指点学习方法.
作者: CrLf    时间: 2019-1-15 12:38

回复 2# ivor


    卧槽!!代码框左上角那个黑绿黑绿的标标是什么武器
作者: ivor    时间: 2019-1-15 12:53

回复 3# yhcfsr
  1. Replace(String, String, Int32, Int32)
  2. In a specified input substring, replaces a specified maximum number of strings that match a regular expression pattern with a specified replacement string.
复制代码
重载了好几种用法,详情访问地址:https://docs.microsoft.com/en-us ... =netframework-4.7.2
作者: yhcfsr    时间: 2019-1-15 12:59

回复  yhcfsr 重载了好几种用法,详情访问地址:
ivor 发表于 2019-1-15 12:53



  非常感谢大佬指点.
作者: Batcher    时间: 2019-1-15 13:21

回复 3# yhcfsr


    《精通正则表达式》这本书里面有介绍。不同的脚本具体语法略有差别,但大致相似。比如 sed、gawk 等也有类似的用法。
作者: 523066680    时间: 2019-1-15 14:17

本帖最后由 523066680 于 2019-1-15 14:59 编辑

回复 4# CrLf

    测试(特殊字体转了曲线,30kb)
   

    不转曲就小很多,1.6KB
   

你把签名链接里的 www 换成 bbs 吧,这样我们就不会在点进去后的页面处于非登录状态
作者: flashercs    时间: 2019-1-15 16:37

ivor 发表于 2019-1-14 22:39



    这两个字符串出现的前后顺序是不一定的,你这样只满足一种条件,考虑全面些好.
  1. [regex]::new('^(?=.*BENDE)(?=.*LASTF).*$\r?\n?',[System.Text.RegularExpressions.RegexOptions]::Multiline).Replace([System.IO.File]::ReadAllText($file,[System.Text.Encoding]::Default),'',1)|Set-Content -LiteralPath $file -Encoding Default
复制代码

作者: 523066680    时间: 2019-1-15 17:28

本帖最后由 523066680 于 2019-1-15 17:44 编辑

楼上说的对,模仿一个:
  1. use File::Slurp;
  2. my $s=read_file("src.txt");
  3. $s=~s/.*((BENDE|LASTF).*){2}\r?\n//;
  4. print $s;
复制代码
(哦这样不严谨,比如重复的 BENDE BENDE,所以还是克隆好了)
  1. use File::Slurp;
  2. my $s=read_file("src.txt");
  3. $s=~s/.*(BENDE.*LASTF|LASTF.*BENDE).*\r?\n//;
  4. print $s;
复制代码

作者: search_Sudoku    时间: 2019-1-15 20:46

本帖最后由 search_Sudoku 于 2019-1-15 20:49 编辑



https://img.shields.io/badge/Shields-IO-white.svg?colorB=dddddd&link=https://shields.io















https://img.shields.io/badge/bathome-.net-blue.svg?logo=powershell&colorA=f7d23d&link=http://bbs.bathome.net
作者: CrLf    时间: 2019-1-15 21:17

回复 8# 523066680


    巴特主推的是 www 的呀,访问 bathome.net 试试,会重定向到 www.bathome.net
作者: CrLf    时间: 2019-1-15 21:20

本帖最后由 CrLf 于 2019-1-15 21:26 编辑


作者: 523066680    时间: 2019-1-15 22:08

本帖最后由 523066680 于 2019-1-16 09:49 编辑

回复 13# CrLf

我有一个蛋疼且不实用的想法:
    用这玩意儿来一段语法高亮的代码。(但肯定不是我实现,我只是消遣区灌水的)

回复  523066680
    这特么加载得多慢
CrLf 发表于 2019-1-15 22:10

这能使加载变慢,想想都exciting
作者: CrLf    时间: 2019-1-15 22:10

回复 14# 523066680


    这特么加载得多慢
作者: yhcfsr    时间: 2019-1-16 00:57

本帖最后由 yhcfsr 于 2019-1-16 01:04 编辑

回复 2# ivor


一个很诡异的问题.代码在ISE中,第一次执行,显示如下错误
然后,再运行一次又正常了.
  1. 找不到“replace”的重载,参数计数为:“3”。
  2. 所在位置 C:\Users\CF\Desktop\无标题2.ps1:3 字符: 2
  3. + ([regex]$pattern='(?=.*BENDE)(?=.*LASTF).*\r?\n?').replace([IO.File]: ...
  4. +  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5.     + CategoryInfo          : NotSpecified: (:) [], MethodException
  6.     + FullyQualifiedErrorId : MethodCountCouldNotFindBest
复制代码
另一个诡异的问题是,右键以powershell运行脚本,无论如何都会有上述的重载错误.

测试环境WIN10,PS版本如下:
  1. Name                           Value
  2. ----                           -----
  3. PSVersion                      5.1.17763.134
  4. PSEdition                      Desktop
  5. PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
  6. BuildVersion                   10.0.17763.134
  7. CLRVersion                     4.0.30319.42000
  8. WSManStackVersion              3.0
  9. PSRemotingProtocolVersion      2.3
  10. SerializationVersion           1.1.0.1
复制代码

作者: flashercs    时间: 2019-1-16 08:27

本帖最后由 flashercs 于 2019-1-16 08:38 编辑

回复 17# yhcfsr


   去掉赋值表达式或把赋值表达式单独一行;
ISE第一次运行失败,但是变量[regex]$pattern已经建立,所以第二次运行是使用内存中已存在的变量$pattern
但是powershell,每次运行都是新的session,所以会失败.
就为了省几个换行符而压缩代码,没必要;难道磁盘空间不够用?
代码易读易维护才重要,越接近人类语言越好,就像写作文一样;机器能读懂,没有学过ps的也能读懂,日后维护也方便.
  1. ([regex]'(?=.*BENDE)(?=.*LASTF).*\r?\n?').replace([IO.File]::ReadAllText($filename), '', 1)
复制代码

作者: yhcfsr    时间: 2019-1-16 09:20

回复 18# flashercs

感谢老哥指点.膜拜^V^
作者: WHY    时间: 2019-1-16 13:30

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (1.txt) do (
  3.     set "s=%%i"
  4.     if !n! LSS 1 (
  5.         if "!s:BENDE=!" NEQ "!s!" (
  6.             if "!s:LASTF=!" NEQ "!s!" (set /a n+=1) else (echo;!s!)
  7.         ) else (echo;!s!)
  8.     ) else (echo;!s!)
  9. )
  10. pause
复制代码
  1. sed -r "0,/BENDE.*LASTF|LASTF.*BENDE/{//d}" 1.txt
复制代码
  1. PowerShell "(type 1.txt) -join \"`r`n\" -replace '^([\s\S]*?).*(?:BENDE.*LASTF|LASTF.*BENDE).*(?:\n|$)', '$1'"
复制代码

作者: yhcfsr    时间: 2019-1-16 19:28

回复 19# WHY

全局变量延迟不安全,会使文件中英文叹号(如果有的话)丢失.
作者: WHY    时间: 2019-1-16 20:55

回复 20# yhcfsr


    没考虑那么多,各位已经有那么多方案了,纯批仅作为一种解题思路,看看就好。
非要尽可能考虑周全的话,也不是办不到:
  1. @echo off
  2. for /f "delims=" %%i in ('findstr /n .* 1.txt') do (
  3.     set "s=%%i"
  4.     setlocal enabledelayedexpansion
  5.     if not defined n (
  6.         if "!s:BENDE=!" NEQ "!s!" (
  7.             if "!s:LASTF=!" NEQ "!s!" (
  8.                 endlocal & set n=1
  9.             ) else (
  10.                 echo;!s:*:=!&endlocal
  11.             )
  12.         ) else (
  13.             echo;!s:*:=!&endlocal
  14.         )
  15.     ) else (
  16.         echo;!s:*:=!&endlocal
  17.     )
  18. )
  19. pause
复制代码





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