|
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 来自 甘肃.临泽
状态 离线
|
|
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 |
|
|
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
状态 离线
|
|
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
状态 离线
|
|
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 |
|