![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 08:52 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]除了sed,还有哪些文本流工具支持原文件直接修改? |
| 可打印版本 2,904 / 15 |
| 第1楼 pooronce | 发表于 2008-04-24 09:58 |
| 中级用户 发帖 250 积分 484 | |
|
[求助]除了sed,还有哪些文本流工具支持原文件直接修改? 发现一个看似小问题却很难解决的:
删除文件末尾的一个换行符 因为多数文本流工具都是行处理,完了每行后跟一个换行,但问题就来了,到最后总是会多一个换行符造成一个空行。我在处理有些东西的时候就遇到了,想用sed来删除这个换行符,却怎么都不行,sed总是会知己再加上那个换行符。 最后只用gawk解决了,不过gawk不支持原文件修改,还是比较麻烦的 用的修改代码是: gawk 'NR^>1{print a}{a=$0}END{ORS="";print a}' file 还有其它文本流处理能支持原文件修改吗? |
|
| 第2楼 vkill | 发表于 2008-04-25 13:35 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
没有,都不可以直接修改愿文件
|
|
| 第3楼 pooronce | 发表于 2008-04-29 12:57 |
| 中级用户 发帖 250 积分 484 | |
Originally posted by vkill at 2008-4-25 01:35 PM: 至少,sed是可以的 ……我想应该不止sed一个的吧,那么多的文本处理命令~ |
|
| 第4楼 abcd | 发表于 2008-04-29 13:02 |
| 银牌会员 发帖 739 积分 1,436 | |
|
直接修改源文件应该是没有的。即使notepad也是在内存中修改好后,再保存的
sed顶多是用H、h来保存,再在最后一行时,G、g。修改好后再输出到源文件。 这样的操作,gawk也是可以的。 |
|
| 第5楼 pooronce | 发表于 2008-04-29 13:14 |
| 中级用户 发帖 250 积分 484 | |
|
也许误会我意思了,我的意思就是能直接处理再保存进原来的文件,该它自己内部是怎么处理的,是不是借用了内存空间什么的。
也就是我自己不用去建临时文件了 sed 加-i 就能直接修改文件,不用自己再改么回存的。 awk却是没这功能的。 就是不知道其它啥命令能支持直接改文件的。 (读文件再直接定向写回原文件,是不可行的,我在awk里面试过,出问题) |
|
| 第6楼 plp626 | 发表于 2008-04-29 13:27 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
这个工具和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 ] |
|
| 第7楼 bjsh | 发表于 2008-04-29 13:33 |
| 银牌会员 发帖 621 积分 2,000 | |
|
sed -i 实际 也是有 临时文件的。。
只是 写入临时文件 和 覆盖你源文件 它给你做了而已。。 |
|
| 第8楼 plp626 | 发表于 2008-04-29 13:34 |
| 银牌会员 发帖 1,020 积分 2,278 | |
Originally posted by bjsh at 2008-4-29 01:33 PM: 所有的支持源文件修改的应该都是这个原理吧? |
|
| 第9楼 pooronce | 发表于 2008-04-29 13:42 |
| 中级用户 发帖 250 积分 484 | |
|
不管它用什么原理的吧,只要能减少硬盘io和用户操作步骤就OK了
plp,这个wfr是哪里找到的啊,gg了一下没找到说明啥的。cygwin包里也没有的。 它是哪个系统下拿过来的? |
|
| 第10楼 plp626 | 发表于 2008-04-29 13:51 |
| 银牌会员 发帖 1,020 积分 2,278 | |
| 第11楼 bjsh | 发表于 2008-04-29 13:52 |
| 银牌会员 发帖 621 积分 2,000 | |
|
楼主的要求 tr 再好不过了。。
tr -d '\r\n'<test.txt>temp.txt && mv temp.txt test.txt |
|
| 第12楼 plp626 | 发表于 2008-04-29 13:53 |
| 银牌会员 发帖 1,020 积分 2,278 | |
Originally posted by pooronce at 2008-4-29 01:42 PM: gg是什么意思? |
|
| 第13楼 pooronce | 发表于 2008-04-29 14:07 |
| 中级用户 发帖 250 积分 484 | |
|
google
|
|
| 第14楼 pooronce | 发表于 2008-04-29 14:10 |
| 中级用户 发帖 250 积分 484 | |
Originally posted by bjsh at 2008-4-29 01:52 PM: 这也是附加的文件改名改回啊 另,我那个要求是,删掉末尾的那个换行符(多余的),不是指每行最后一个。 |
|
| 第15楼 pooronce | 发表于 2008-04-29 14:14 |
| 中级用户 发帖 250 积分 484 | |
Originally posted by plp626 at 2008-4-29 01:51 PM: 谢谢推荐,工具很强悍 ……可惜的是好像是只支持win32或dos环境 |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |