Board logo

标题: [求助]除了sed,还有哪些文本流工具支持原文件直接修改? [打印本页]

作者: pooronce     时间: 2008-4-24 09:58    标题: [求助]除了sed,还有哪些文本流工具支持原文件直接修改?
发现一个看似小问题却很难解决的: 删除文件末尾的一个换行符 因为多数文本流工具都是行处理,完了每行后跟一个换行,但问题就来了,到最后总是会多一个换行符造成一个空行。我在处理有些东西的时候就遇到了,想用sed来删除这个换行符,却怎么都不行,sed总是会知己再加上那个换行符。 最后只用gawk解决了,不过gawk不支持原文件修改,还是比较麻烦的 用的修改代码是: gawk 'NR^>1{print a}{a=$0}END{ORS="";print a}' file 还有其它文本流处理能支持原文件修改吗?

作者: vkill     时间: 2008-4-25 13:35
没有,都不可以直接修改愿文件

作者: pooronce     时间: 2008-4-29 12:57
Originally posted by vkill at 2008-4-25 01:35 PM: 没有,都不可以直接修改愿文件
至少,sed是可以的 ……我想应该不止sed一个的吧,那么多的文本处理命令~

作者: abcd     时间: 2008-4-29 13:02
直接修改源文件应该是没有的。即使notepad也是在内存中修改好后,再保存的 sed顶多是用H、h来保存,再在最后一行时,G、g。修改好后再输出到源文件。 这样的操作,gawk也是可以的。

作者: pooronce     时间: 2008-4-29 13:14
也许误会我意思了,我的意思就是能直接处理再保存进原来的文件,该它自己内部是怎么处理的,是不是借用了内存空间什么的。 也就是我自己不用去建临时文件了 sed 加-i 就能直接修改文件,不用自己再改么回存的。 awk却是没这功能的。 就是不知道其它啥命令能支持直接改文件的。  (读文件再直接定向写回原文件,是不可行的,我在awk里面试过,出问题)

作者: plp626     时间: 2008-4-29 13:27
这个工具和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)具体请参考:www.unicode.org/versions/Unico ...。 关于 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:"朋友们" ========================================================================== 下载: upload.cn-dos.net/img/340.rar [ Last edited by plp626 on 2008-4-29 at 01:32 PM ]

作者: bjsh     时间: 2008-4-29 13:33
sed -i 实际 也是有 临时文件的。。 只是 写入临时文件 和 覆盖你源文件 它给你做了而已。。

作者: plp626     时间: 2008-4-29 13:34
Originally posted by bjsh at 2008-4-29 01:33 PM: sed -i 实际 也是有 临时文件的。。 只是 写入临时文件 和 覆盖你源文件 它给你做了而已。。
所有的支持源文件修改的应该都是这个原理吧?

作者: pooronce     时间: 2008-4-29 13:42
不管它用什么原理的吧,只要能减少硬盘io和用户操作步骤就OK了 plp,这个wfr是哪里找到的啊,gg了一下没找到说明啥的。cygwin包里也没有的。 它是哪个系统下拿过来的?

作者: plp626     时间: 2008-4-29 13:51
asbai的原创作品,咱论坛里的某位牛人。 baiy.cn/ 由于sed我不怎么熟悉,所以我感觉wfr还是蛮好用的。

作者: bjsh     时间: 2008-4-29 13:52
楼主的要求 tr 再好不过了。。 tr -d '\r\n'<test.txt>temp.txt && mv temp.txt test.txt

作者: plp626     时间: 2008-4-29 13:53
Originally posted by pooronce at 2008-4-29 01:42 PM: 不管它用什么原理的吧,只要能减少硬盘io和用户操作步骤就OK了 plp,这个wfr是哪里找到的啊,gg了一下没找到说明啥的。cygwin包里也没有的。 它是哪个系统下拿过来的?
gg是什么意思?

作者: pooronce     时间: 2008-4-29 14:07
google

作者: pooronce     时间: 2008-4-29 14:10
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
这也是附加的文件改名改回啊 另,我那个要求是,删掉末尾的那个换行符(多余的),不是指每行最后一个。

作者: pooronce     时间: 2008-4-29 14:14
Originally posted by plp626 at 2008-4-29 01:51 PM: asbai的原创作品,咱论坛里的某位牛人。 baiy.cn/ 由于sed我不怎么熟悉,所以我感觉wfr还是蛮好用的。
谢谢推荐,工具很强悍 ……可惜的是好像是只支持win32或dos环境

作者: slore     时间: 2008-4-29 18:05
VBS~~~飘过~~~