无忧启动论坛

 找回密码
 注册
搜索

bat处理文本,如何保留所有空行

查看数: 2074 | 评论数: 36 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-11-22 13:48

正文摘要:

本帖最后由 nfans 于 2023-11-22 15:25 编辑 需求: 1,删除a.txt中行首4个空格(所有行:行首指定数量) 2,同时保留原文件中所有空行(所有空行不做处理) 本人对批处理是门外汉,利用百度来的代码已实现 ...

回复

无犹启动 发表于 2024-4-18 09:13:17
谢谢分享
hehuiying 发表于 2024-4-16 01:20:23
谢谢分享
yyz2191958 发表于 2024-2-8 20:05:45
进来学习
lxn0871 发表于 2024-2-8 19:40:48
学习学习
无犹启动 发表于 2024-2-8 10:48:34
学习学习
huqiu2 发表于 2023-11-24 20:17:20
nttwqz 发表于 2023-11-22 17:37
vscode打开
选中那几行,shift+Tab,搞定!

百度  VBS代码在线格式化美化工具 就搞定了,bat太费劲了
cao8mm 发表于 2023-11-23 11:38:44
观摩学习
nfans 发表于 2023-11-23 10:57:12
szwp 发表于 2023-11-23 10:39
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=420811&pid=4075512&fromuid=225195

...

是的,当是随便从论坛扒了一个代码复制出来
szwp 发表于 2023-11-23 10:39:02

点评

是的,当是随便从论坛扒了一个代码复制出来  详情 回复 发表于 2023-11-23 10:57
hfxiang 发表于 2023-11-23 09:16:54
如果接受第3方工具sed(下载: http://bcn.bathome.net/tool/4.9/sed.exe )就比较简单(空格数,下例为{4},可根据需要修改):
sed -r -i.bak "s/^ {4}//" a.txt

评分

参与人数 1无忧币 +5 收起 理由
nfans + 5 很给力! 超牛,输出结果完美!

查看全部评分

junyee 发表于 2023-11-23 07:55:51
折腾啥。
windows 处理空行和换行都麻烦。

正则 "^    " 替换成 ""  不就行了。

fzp070 发表于 2023-11-23 00:54:49
观摩学习,感谢各位大佬解题!
我其实也有个想要的功能,就是删除所有空行(非空格),一直没研究成功。
yyz2191958 发表于 2023-11-22 17:54:06
进来学习
Zap 发表于 2023-11-22 17:43:56
nfans 发表于 2023-11-22 17:31
报告各位大佬,目标越来越接近,此处从11行起开始原本对齐的变得没对齐了

你原文本就多空格

点评

a.txt红色竖线前面4个空格,处理后的b.txt前几行处理是正确的,后面还剩余一个空格, 刚复制下来才发现论坛代码控件会自动给粘贴的内容行首增加4个空格 另外,这个批处理对空行保留的处理是否具有通用性?如果是  详情 回复 发表于 2023-11-23 09:59
nttwqz 发表于 2023-11-22 17:37:04
vscode打开
选中那几行,shift+Tab,搞定!

点评

百度 VBS代码在线格式化美化工具 就搞定了,bat太费劲了  详情 回复 发表于 2023-11-24 20:17
Zap 发表于 2023-11-22 17:16:45
  1. @echo off
  2. ::删所有行首4字符并保留其它空行到b.txt
  3. (for /f "delims=" %%i in ('findstr /n .* a.txt')do (
  4.         set "t=%%i"
  5.     setlocal enabledelayedexpansion
  6.     set x=!t:*:=!
  7.         echo=!t:~6!
  8.     endlocal
  9. ))>"b.txt"
  10. pause
复制代码

点评

报告各位大佬,目标越来越接近,此处从11行起开始原本对齐的变得没对齐了 [attachimg]534776[/attachimg]  详情 回复 发表于 2023-11-22 17:31
nfans 发表于 2023-11-22 16:27:19
感谢各位朋友热心帮助测试,综合使用9、17、18楼代码仍有明显bug,有条件请用 Beyond Compare 比对测试。
smss 发表于 2023-11-22 16:07:10
楼上已有最佳答案
  1. @echo off&setlocal enabledelayedexpansion
  2. ::删所有行首4字符并保留其它空行到b.txt
  3. (for /f "delims=" %%i in ('findstr /n .* a.txt')do set "t=%%i"&echo=!t:~6!)>b.txt
  4. pause
复制代码
ppll2030 发表于 2023-11-22 16:01:16
你代码的第三行,改成
  1. (for /f "tokens=1* delims=:" %%h in ('findstr /n .* %fn%')do (
复制代码
rbwrbw 发表于 2023-11-22 15:57:26
高手如云
nathan6498 发表于 2023-11-22 15:55:24
学习学习
szwp 发表于 2023-11-22 15:49:05
newyun 发表于 2023-11-22 15:42
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2")
Set col ...

先用findstr /n给原文件加行号,再去掉,就能留空行了。
在9楼基础上改改试试。
newyun 发表于 2023-11-22 15:42:25
nfans 发表于 2023-11-22 15:39
是删所有行行首,并保留空格,请注意审题,所以结果还不正确

空格与空行别弄混了

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")
For Each objItem in colItems
OSA = objItem.OSArchitecture
Next
Const HKLM = &H80000002
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}StdRegProv")
If OSA = "64-bit" Then
oReg.GetStringValue HKLM,"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\XReplace","UninstallString",UninstallString
If Not IsNull(UninstallString) Then InstallLocation = Replace(UninstallString,"uninstall","XReplace")
Else
oReg.GetStringValue HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XReplace","UninstallString",UninstallString
If Not IsNull(UninstallString) Then InstallLocation = Replace(UninstallString,"uninstall","XReplace")
End If
Set WshShell = WScript.CreateObject("WScript.Shell")
If IsNull(InstallLocation) Then
WshShell.Popup "杞欢鏈畨瑁咃紒", 5, "閿欒", 0
WScript.Quit
End If
Name = Array("XReplace.exe")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,(Debug)}\\.\root\cimv2")
Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process")
For Each objProcess In colProcessList
For Each Process In Name
If LCase(objProcess.Name) = LCase(Process) Then
objProcess.Terminate()
End If
Next
Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(InstallLocation) Then
Set ado_stream = CreateObject("ADODB.Stream")
ado_stream.Type = 1
ado_stream.open
ado_stream.LoadFromFile InstallLocation
ado_stream.position = 215133
ado_stream.Write HexToByte("E9B701000090")
ado_stream.position = 256771
ado_stream.Write HexToByte("E9CE02000090")
ado_stream.position = 277094
ado_stream.Write HexToByte("01")
ado_stream.position = 313599
ado_stream.Write HexToByte("B80100")
ado_stream.position = 313855
ado_stream.Write HexToByte("B80100")
ado_stream.position = 314442
ado_stream.Write HexToByte("B80100")
ado_stream.position = 314901
ado_stream.Write HexToByte("B80100")
ado_stream.SaveToFile InstallLocation, 2
ado_stream.Close
Set ado_stream = Nothing
End If
WshShell.Popup "瓒呯骇瀛楃涓叉壒閲忔浛鎹㈠伐鍏?v4.2.5 鐮磋В琛ヤ竵" & vbnewline & vbnewline & "鍒朵綔锛欳hiShingChan  缂栫▼璇█锛歏BScript",10,"瀹屾垚",0
Function HexToByte(hexStr)
Set xmldom = Wscript.CreateObject("Microsoft.XMLDOM")
Set byteObj= xmldom.createElement("byteObj")
byteObj.dataType = "bin.hex"
byteObj.nodeTypedValue = hexStr
HexToByte=byteObj.nodeTypedValue
End Function
这是 测试过来的结果,会把空行也处理掉,我想不出更好的办法了。我没转成ANSI所以中文乱码了。你注意下就行了

点评

先用findstr /n给原文件加行号,再去掉,就能留空行了。 在9楼基础上改改试试。  详情 回复 发表于 2023-11-22 15:49
nfans 发表于 2023-11-22 15:39:54
newyun 发表于 2023-11-22 15:28
@echo off
setlocal enabledelayedexpansion

是删所有行行首,并保留空格,请注意审题,所以结果还不正确

空格与空行别弄混了

点评

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}\\.\root\cimv2") Set colItems = objWMIService.ExecQuery ("Select * from Win32_OperatingSystem") For Each objItem in colItems  详情 回复 发表于 2023-11-22 15:42
szwp 发表于 2023-11-22 15:34:39
nfans 发表于 2023-11-22 15:32
原需求就是来自于论坛这个代码插件不能使用,试了多个浏览器都没搞定……
图片能上传却不能上传txt是何 ...

这个功能需要flash

点评

啊,感谢!我试试  发表于 2023-11-22 15:42
Zap 发表于 2023-11-22 15:28:59
  1. @echo off&setlocal enabledelayedexpansion&set n=0
  2. ::删除行首4个字符保留其它空行到b.txt
  3. (for /f "delims=" %%a in ('findstr /n .* a.txt') do (
  4.         set "t=%%a"
  5.     if !n!==0 (echo=!t:~6!)else echo=!t:~2!
  6.     set /a n+=1
  7. ))> b.txt
  8. pause
复制代码

评分

参与人数 1无忧币 +5 收起 理由
smss + 5 很给力!

查看全部评分

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-6-8 04:59

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表