中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]除了sed,还有哪些文本流工具支持原文件直接修改?
« [1] [2] »
作者:
标题: [求助]除了sed,还有哪些文本流工具支持原文件直接修改? 上一主题 | 下一主题
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『楼 主』:  [求助]除了sed,还有哪些文本流工具支持原文件直接修改?

发现一个看似小问题却很难解决的:

删除文件末尾的一个换行符


因为多数文本流工具都是行处理,完了每行后跟一个换行,但问题就来了,到最后总是会多一个换行符造成一个空行。我在处理有些东西的时候就遇到了,想用sed来删除这个换行符,却怎么都不行,sed总是会知己再加上那个换行符。 最后只用gawk解决了,不过gawk不支持原文件修改,还是比较麻烦的

用的修改代码是:
gawk 'NR^>1{print a}{a=$0}END{ORS="";print a}' file

还有其它文本流处理能支持原文件修改吗?

2008-4-24 09:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 2 楼』:  

没有,都不可以直接修改愿文件

2008-4-25 13:35
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by vkill at 2008-4-25 01:35 PM:
没有,都不可以直接修改愿文件

至少,sed是可以的
……我想应该不止sed一个的吧,那么多的文本处理命令~

2008-4-29 12:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 4 楼』:  

直接修改源文件应该是没有的。即使notepad也是在内存中修改好后,再保存的

sed顶多是用H、h来保存,再在最后一行时,G、g。修改好后再输出到源文件。

这样的操作,gawk也是可以的。

2008-4-29 13:02
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 5 楼』:  

也许误会我意思了,我的意思就是能直接处理再保存进原来的文件,该它自己内部是怎么处理的,是不是借用了内存空间什么的。
也就是我自己不用去建临时文件了

sed 加-i 就能直接修改文件,不用自己再改么回存的。 awk却是没这功能的。
就是不知道其它啥命令能支持直接改文件的。 

(读文件再直接定向写回原文件,是不可行的,我在awk里面试过,出问题)

2008-4-29 13:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 6 楼』:  

这个工具和sed都支持源文本直接修改,推荐下,那个更好用先体验体验。。。
------------------
wfr - 支持多国语言的字符串批量查找和替换
    - 批量字符集编码转换

≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
功能简介

  ■ 纯 unicode 规则匹配内核,真正支持各国语言文字的正则匹配。

  ■ 带有兼容性检查的字符集编码转换功能。同时支持 GUN libiconv(iconv.dll) 和 Windows 自带的字符集编码转换 API。

  ■ 支持一次性指定多个文件通配符和文件列表。

  ■ 支持管道模式,与其它命令协同工作;支持半管道模式,从文件中获取输入,但将结果写到标准输出。

  ■ 支持包含子目录。

  ■ 支持普通匹配、正则匹配、可忽略大小写、可跨行匹配。替换时可以使用正则的子表达式。

  ■ 同时支持 posix 标准的扩展正则表达式及 perl 风格的正则匹配。

  ■ 可以格式化替换内容为全大写或全小写,便于在批处理中对环境变量和命令行参数做大小写一致化处理。

  ■ 支持 DOS(Windows)、Macintosh 和 unix 风格的换行符,可选择自动识别(默认)或手动指定。

  ■ 统计功能,列出每个文件中的替换次数、总替换次数等。

  ■ 支持Win32和纯DOS环境(纯DOS环境中需要 HX DOS Extender 支持)。


≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
Unicode 正则匹配

wfr 内部使用作者自己捣鼓的 UNICODE 正则匹配引擎。咳...咳..该引擎功能强大,效率出众,绝对是外出打鸟……(以下暂省10000字,有空再补上 ;) )。

以下举例说明:

  ■ 小写类能够正确匹配各国小写字母。如:中文全角字母“abcd”;希腊字母“α、β、ω”;俄文字母“ж、я、щ” 等等。

  ■ 大写类能够匹配各国大写字母。如:全角字母“ABCD”;希腊字母“Α、Β、Ω”;俄文字母“Ж、Я、Щ”等等。

  ■ 字符类能匹配各国字母(中日韩的汉字也属于该类)。

  ■ 标点类能够匹配各国标点符号,如:“、,。……『』”等等。

  ■ 所有操作都支持宽字符,例如,表达式:“[我你他她它]们”将被正确处理。

其它(数字、空白符、词边界等等)以此类推,全方位支持多语言。以上字符分类的规则 遵循UNICODE标准分类(UNICODE General Category Values)具体请参考:http://www.unicode.org/versions/Unicode4.0.0/ch04

关于 UNICODE 正则的操作效率,这个引擎比我能找到的所有开源的非 UNICODE 匹配引擎至少快一倍左右(因为所有字符类的匹配都是直接查表映射的,都是标准 O(1) 算法)。

不过这只是匹配引擎的效率,由于所有文件在“匹配->替换”前后都要做一次编码转换,所以典型应用下,wfr 效率比 fr 低一些。wfr 并不是 fr 的升级版,能够用 fr 搞定的任务不推荐用 wfr 完成。


≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
字符集编码

wfr 支持分别指定三个参量的字符集编码:

  ■ 输入编码:输入文件或管道中内容的字符集编码。默认为当前系统的默认代码页。

  ■ 输出编码:完成搜索->替换操作后,要输出到目标文件或管道中的编码。默认与输入编码相同。

  ■ 参数编码:指定搜索和替换参数的内容使用何种字符集编码。默认为当前系统的默认代码页。

例如:“wfr *.txt *.htm -r:"[иウ]" -t:"狟ね" -encarg:big5 -encin:gbk -encout:utf-8 -s” 把当前目录和所有子目录下的任何 txt 及 htm 文件中的“[你我他她它]们” 都替换为“朋友们”;文件的编码为:gbk,参数使用 big5 指定,替换后将文件格式改为 utf-8 编码保存。

咋一看指定参数编码好像没用,其实不然。例如在异种语言环境下(如在中文系统下操作韩文)的搜索替换;在DOS下使用wfr(DOS的系统默认代码页永远是ASCII)等场合,指定参数编码是很有意义的。

关于字符集转换功能库,如果当前系统搜索路径中存在 GUN 的 libiconv 库(iconv.dll),则优先使用 libiconv,否则使用操作系统自带的字符集转换 API。这样做的考虑如下:

  ■更严谨和稳定的结果:iconv 比 Windows 的字符集转换 API 更严格,不会出现意想不到的乱码和连篇问号等情况。

  ■更有保障的支持:Windows 能否成功完成指定字符集编码转换,很大程度上取决于用户是否安装了相关的代码页文件。在任何部署了 libiconv 库的计算机中,该库支持的字符集编码都能够被正确地转换。

  ■跨平台支持:libiconv 可以用于几乎所有已知的平台。
===========================================================================
应用示例:
  wfr *.txt *.htm -f:teh -t:the
  wfr *.txt -fic:"My Dir" -tu:"%ROOTDIR%"
  type server.log | wfr /r:"Connected.*218.79" /t:"**Attack** \0"
  type server.log | wfr /r:"^(Smith|James).*\n" /t
  unzip -l *.zip | wfr /r:"^(.{22}:\d\d\s*|(A|  \a| -|.*files$).*\n)" /t
  wfr *.txt /s /any /encin:gbk /encout:utf-8
  wfr *.log /any /encin:ucs-2 /encout:gbk /stdout | OtherApp.exe ...
  wfr *.txt *.htm -r:"张(\a+/>)" -t:"李\1"
  wfr *.txt *.htm -r:"[你我他她它]们" -t:"朋友们"

==========================================================================
下载:
http://upload.cn-dos.net/img/340.rar

[ Last edited by plp626 on 2008-4-29 at 01:32 PM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-29 13:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 7 楼』:  

sed -i 实际 也是有 临时文件的。。

只是 写入临时文件 和 覆盖你源文件 它给你做了而已。。

2008-4-29 13:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by bjsh at 2008-4-29 01:33 PM:
sed -i 实际 也是有 临时文件的。。

只是 写入临时文件 和 覆盖你源文件 它给你做了而已。。

所有的支持源文件修改的应该都是这个原理吧?



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-29 13:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 9 楼』:  

不管它用什么原理的吧,只要能减少硬盘io和用户操作步骤就OK了

plp,这个wfr是哪里找到的啊,gg了一下没找到说明啥的。cygwin包里也没有的。
它是哪个系统下拿过来的?

2008-4-29 13:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 10 楼』:  

asbai的原创作品,咱论坛里的某位牛人。
http://baiy.cn/
由于sed我不怎么熟悉,所以我感觉wfr还是蛮好用的。



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-29 13:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bjsh
银牌会员





积分 2000
发帖 621
注册 2007-1-1
状态 离线
『第 11 楼』:  

楼主的要求 tr 再好不过了。。

tr -d '\r\n'<test.txt>temp.txt && mv temp.txt test.txt

2008-4-29 13:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by pooronce at 2008-4-29 01:42 PM:
不管它用什么原理的吧,只要能减少硬盘io和用户操作步骤就OK了

plp,这个wfr是哪里找到的啊,gg了一下没找到说明啥的。cygwin包里也没有的。
它是哪个系统下拿过来的?

gg是什么意思?



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-29 13:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 13 楼』:  

google

2008-4-29 14:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by bjsh at 2008-4-29 01:52 PM:
楼主的要求 tr 再好不过了。。

tr -d '\r\n'<test.txt>temp.txt && mv temp.txt test.txt

这也是附加的文件改名改回啊

另,我那个要求是,删掉末尾的那个换行符(多余的),不是指每行最后一个。

2008-4-29 14:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by plp626 at 2008-4-29 01:51 PM:
asbai的原创作品,咱论坛里的某位牛人。
http://baiy.cn/
由于sed我不怎么熟悉,所以我感觉wfr还是蛮好用的。

谢谢推荐,工具很强悍
……可惜的是好像是只支持win32或dos环境

2008-4-29 14:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: