Board logo

标题: [文件操作] 【已解决】批处理如何将一个文本内容修改后写入/输出到源文件/原文件? [打印本页]

作者: idos    时间: 2016-9-11 18:39     标题: 【已解决】批处理如何将一个文本内容修改后写入/输出到源文件/原文件?

本帖最后由 idos 于 2016-9-13 10:23 编辑

例如:有一个名为test.txt的文本文件,内容如下


2016-1    20
2016-9    30
2016-6    40
2016-8    50
2016-2    60
2016-4    70
2016-1    80


我写一个批处理文件,使最后的两位数都改成15。然后问题来了,怎样输出到源文件中,并且源文件只能包括执行结果的信息?
这是我写的代码:
  1. @echo off
  2. for /f %%i in (test.txt) do (
  3. echo %%i   15
  4. )>>完成.txt
  5. pause
复制代码

作者: CrLf    时间: 2016-9-11 18:56

两种办法

1.常规做法:
  1. @echo off
  2. (for /f %%i in (test.txt) do (
  3. echo %%i   15
  4. ))>完成.txt
  5. ren 完成.txt test.txt
  6. pause
复制代码
2.玩技巧:
  1. @echo off
  2. %1 %0 :1 | %0 :2 & exit /b
  3. if %1==:1 (
  4.    for /f %%i in (test.txt) do (
  5. echo %%i   15
  6.    )
  7. ) else if %1==:2 (
  8.    find /v "" >test.txt
  9. )
复制代码

作者: idos    时间: 2016-9-11 19:07

回复 2# CrLf


    第一个会提示有重名文件,不成功。第二个可以,效果很好,但没看懂是什么意思
作者: GNU    时间: 2016-9-11 19:18

回复 3# idos


@echo off
(for /f %%i in (test.txt) do (
        echo %%i   15
))>完成.txt
move /y 完成.txt test.txt
作者: CrLf    时间: 2016-9-11 19:26

顺便说一句,还有一种办法,这里以输出 type 的结果到源文件为例
  1. type test.txt | sort /+65535 | sort /+65535 /o:test.txt
复制代码
兼容性还可以,不过其实并没什么必要
作者: pcl_test    时间: 2016-9-11 21:23

本帖最后由 pcl_test 于 2016-9-11 21:57 编辑

路过
  1. powershell -c "(gc 'test.txt'|%%{$_.split()[0]+'    15'})|Out-File 'test.txt'"&pause
复制代码
第三方
  1. sed -i -r "s/\S+$/15/" "test.txt"&pause
复制代码
  1. gawk "{s=s\"\"$1\"    15\n\"}END{printf s>\"test.txt\"}" "test.txt"&pause
复制代码

作者: Batcher    时间: 2016-9-11 21:53

友情提示,gawk等某些方案直接修改原文件容易导致数据丢失,尤其是大文件。请务必谨慎使用。
用临时文件过渡一下比较安全。
作者: CrLf    时间: 2016-9-12 04:54

回复 7# Batcher


    从没遇到过 gawk 丢失数据的情况,处理过 1G+ 的大文件,也没什么问题,可否举个极端的例子?
作者: idos    时间: 2016-9-12 09:04

回复 6# pcl_test


    不是批处理,但也挺厉害的....
作者: wskwfkbdn    时间: 2016-9-12 11:12

回复 8# CrLf


    无法是速度慢点,一般极少需要处理大数据文本的,20mb算是无压力的
作者: idos    时间: 2016-9-13 10:23

谢谢各位的耐心解答....如果有别的方法,也可以继续列出来




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