无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 5623|回复: 38
打印 上一主题 下一主题

[已解决] [感谢kli] 帮忙从GoogleCode下载搜索替换命令行工具“rxrepl”

[复制链接]
跳转到指定楼层
1#
发表于 2019-2-1 12:11:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 2010hook 于 2020-6-16 09:44 编辑

这是搜索替换的小工具,支持Unicode和Perl正则式,评价很高。
https://sites.google.com/site/regexreplace/
感谢!
Search using Perl Compatible Regular Expressions
Use group matching in replacement text
Supports Windows and Unix line endings
Unicode support
Accepts multiple search/replace arguments
Options may be provided in an options file
Scan for files
Preview mode
Line and full file matching modes

推荐
 楼主| 发表于 2019-2-1 20:42:25 | 只看该作者
本帖最后由 2010hook 于 2023-2-24 06:55 编辑

找到个范例,可把Unicode文本中这行任意日期替换成“2014.06.01”:

<entry key="!Version">????.??.??</entry>

  1. rxrepl -I test.xml !Version\x22\x3e....\...\... -r !Version\x22\x3e2014.06.01
复制代码


有效的新版语法:
  1. rxrepl -f "test.xml" -o "test_2.xml" -s "Version\x22\x3e....\...\..." -r "Version\x22\x3e2014.06.01"
复制代码

回复

使用道具 举报

3#
发表于 2019-2-1 12:34:36 | 只看该作者
喜刷刷

rxrepl.zip

284.67 KB, 下载次数: 67, 下载积分: 无忧币 -2

评分

参与人数 1无忧币 +5 收起 理由
2010hook + 5 又是你!!感谢!

查看全部评分

回复

使用道具 举报

4#
 楼主| 发表于 2019-2-1 12:50:41 | 只看该作者

非常感谢!
感觉你的生活很幸福啊~
回复

使用道具 举报

5#
发表于 2019-2-1 13:22:17 来自手机 | 只看该作者
好用吗,能不能支持utf8?
回复

使用道具 举报

6#
 楼主| 发表于 2019-2-1 14:41:14 | 只看该作者
本帖最后由 2010hook 于 2019-2-1 19:16 编辑
窄口牛 发表于 2019-2-1 13:22
好用吗,能不能支持utf8?

rxrepl.exe -f "Templates_Unicode.reg" -o "Templates_Unicode222.reg" -s "@" -r "®"
想替换成“®”,却看到“庐”,不知是否要用正则式。
回复

使用道具 举报

7#
发表于 2019-2-1 15:04:55 来自手机 | 只看该作者
注册表文件用vbs好了。
回复

使用道具 举报

8#
 楼主| 发表于 2019-2-2 00:48:31 | 只看该作者
本帖最后由 2010hook 于 2020-6-10 18:34 编辑

我搞懂了!
要先把符号转换成相应字符集的编码,才能正确转换!
比如“@”要替换成“®”,直接输入字符,会转出乱码。而写成Unicode编码“\u00ae”,就能正确转换了:
  1. rxrepl.exe -f "Templates_Unicode.reg" -o "Templates_Unicode_222.reg" -s "@" -r "\u00ae"
复制代码
  1. rxrepl.exe -f "Templates_Unicode.reg" -a -s "@" -r "\u00ae" --no-backup
复制代码
回复

使用道具 举报

9#
 楼主| 发表于 2019-2-2 01:39:29 | 只看该作者
本帖最后由 2010hook 于 2019-2-2 19:39 编辑

rxrepl 确实比 wfr/fr 更科学、更好用。
wfr 查询结果依赖系统代码页或iconv,不稳定,效率不高。
rxrepl 不用管系统有没有完整代码页,它直接修改底层字符编码,确保准确对应,更高效、更可靠。
rxrepl 的语法也更简明。
回复

使用道具 举报

10#
 楼主| 发表于 2019-2-2 10:19:37 | 只看该作者
窄口牛 发表于 2019-2-1 13:22
好用吗,能不能支持utf8?

非常好用
回复

使用道具 举报

11#
 楼主| 发表于 2019-2-3 15:08:11 | 只看该作者
本帖最后由 2010hook 于 2020-5-1 07:33 编辑

这里有个html方案,批量转换Unicode编码(保存为htm,用浏览器打开):
  1. <script type="text/javascript">
  2.         function a(pChoice){
  3.                 var inputEle = document.getElementById('input_area');
  4.                 var outputEle = document.getElementById('output_area');
  5.                 switch(pChoice){
  6.                         case "CONVERT_FMT1":
  7.                                 outputEle.value = ascii(inputEle.value);
  8.                                 break;
  9.                         case "CONVERT_FMT2":
  10.                                 outputEle.value = unicode(inputEle.value);
  11.                                 break;
  12.                         case "CONVERT_FMT3":
  13.                                 outputEle.value = unicode1(inputEle.value);
  14.                                 break;
  15.                                 case "RECONVERT":
  16.                                 outputEle.value = reconvert(inputEle.value);
  17.                                 break;
  18.                         }
  19.         }
  20.         function ascii(str){
  21.                 var value='';
  22.                 for (var i = 0; i < str.length; i++) {
  23.                         value += '\&#x' + left_zero_4(parseInt(str.charCodeAt(i)).toString(16))+';';
  24.                 }
  25.                 return value;
  26.         }
  27.         function unicode(str){
  28.                 var value='';
  29.                 for (var i = 0; i < str.length; i++) {
  30.                 value += '\\u' + left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
  31.                 }
  32.                 return value;
  33.         }
  34.         function left_zero_4(str) {
  35.                 if (str != null && str != '' && str != 'undefined') {
  36.                         if (str.length == 2) {
  37.                                 return '00' + str;
  38.                         }
  39.                 }
  40.                 return str;
  41.         }
  42.         function unicode1(str){
  43.                 var value='';
  44.                 for (var i = 0; i < str.length; i++)
  45.                 value += '&#' + str.charCodeAt(i) + ';';
  46.                 return value;
  47.         }
  48.         function reconvert(str){
  49.                 str = str.replace(/(\\u)(\w{1,4})/gi,function($0){
  50.                         return (String.fromCharCode(parseInt((escape($0).replace(/(%5Cu)(\w{1,4})/g,"$2")),16)));
  51.                 });
  52.                 str = str.replace(/(&#x)(\w{1,4});/gi,function($0){
  53.                         return String.fromCharCode(parseInt(escape($0).replace(/(%26%23x)(\w{1,4})(%3B)/g,"$2"),16));
  54.                 });
  55.                 str = str.replace(/(&#)(\d{1,6});/gi,function($0){
  56.                         return String.fromCharCode(parseInt(escape($0).replace(/(%26%23)(\d{1,6})(%3B)/g,"$2")));
  57.                 });
  58.                 return str;
  59.         }
  60. </script>
  61. <style>
  62. textarea {
  63. width: 96%;
  64. height: 30%;
  65. margin: 1% 2%;
  66. padding:2px;
  67. resize:vertical;
  68. border: 1px solid #CCC;
  69. box-shadow: 2px 2px 5px #d3d6da;
  70. -moz-box-shadow: 2px 2px 5px #d3d6da;
  71. }
  72. </style>
  73.         <br>
  74.         <div class='divider'></div>
  75.         <textarea id="input_area" name="input_area" placeholder="输入字符" value="">中文</textarea>
  76.                 <div class='row' style="margin:0% 2%;">
  77.                         <button onclick="javascript:a('CONVERT_FMT2');">转Unicode</button>
  78.                         <button onclick="javascript:a('RECONVERT');">Unicode转</button>
  79.                         <button onclick="javascript:a('RECONVERT')">ASCII转Unicode</button>
  80.                         <button onclick="javascript:a('CONVERT_FMT3');">Unicode转ASCII</button>
  81.                         <button onclick="javascript:a('CONVERT_FMT1');">转换&#XXXX</button>
  82.                 </div>
  83. <textarea name="output_area" id="output_area" onclick="this.select();" placeholder="输出结果" value=""></textarea>
复制代码
回复

使用道具 举报

12#
 楼主| 发表于 2019-2-3 17:44:58 | 只看该作者
本帖最后由 2010hook 于 2020-6-10 20:41 编辑

我测试发现,用rxrepl替换路径,只需要转换“\”为“\x5c”就行,无需把中文、字母和“:”、“-”转码。
  1. pushd "%~dp0"
  2. set "var=%cd:\=\x5c\x5c%"
  3. rxrepl.exe -f "test.reg" -o "test_222.reg" --output-encoding utf16le -s "D:\x5c\x5cOffice" -r "%var%"
复制代码
回复

使用道具 举报

13#
 楼主| 发表于 2019-2-3 21:50:18 | 只看该作者
本帖最后由 2010hook 于 2019-2-9 17:08 编辑

*.reg 是不能用 --no-bom 参数的,清除BOM后,系统会识别错误。
回复

使用道具 举报

14#
发表于 2019-2-28 17:10:01 | 只看该作者
兄弟,你的Office的帖子咋关闭了啊?我前段时间看着你更新,但是当时没来得及下载,今天来就看到帖子关闭了
回复

使用道具 举报

15#
 楼主| 发表于 2019-2-28 21:36:46 | 只看该作者
ikaka 发表于 2019-2-28 17:10
兄弟,你的Office的帖子咋关闭了啊?我前段时间看着你更新,但是当时没来得及下载,今天来就看到帖子关闭了

下载地址还有效。知识产权保护日趋严格。

点评

兄弟,你最新的office下载地址是多少?之前的帖子关闭看不到了  详情 回复 发表于 2019-3-4 21:10
回复

使用道具 举报

16#
发表于 2019-3-1 09:01:31 | 只看该作者
顶,涨知识的帖子
回复

使用道具 举报

17#
发表于 2019-3-4 21:10:00 | 只看该作者
2010hook 发表于 2019-2-28 21:36
下载地址还有效。知识产权保护日趋严格。

兄弟,你最新的office下载地址是多少?之前的帖子关闭看不到了
回复

使用道具 举报

18#
发表于 2020-5-17 12:23:41 | 只看该作者
剛摸了一下,不直覺。
用了通配符還得搭配 --dir -I 這兩個參數
最重要的是沒辨法換如  (x64) 換成 abc,就是字串裏面有 () 它就不認識。
或許有其它方法,但這簡單的搜尋取代還要花時間去學,麻煩。
好處是支援大檔的Unicode,像fr.exe就讀不到大檔案的Unicode。
fart.exe 更是簡單易用,就 fart.exe *.txt "Search" "Replace"

点评

( ) 写成 \x28 \x29,特此修正!  发表于 2020-6-10 21:00
( ) 写成 \u0028 \u0029  发表于 2020-6-10 18:28
回复

使用道具 举报

19#
 楼主| 发表于 2020-6-10 18:26:35 | 只看该作者
本帖最后由 2010hook 于 2020-6-10 22:03 编辑

你要把符号写成UTF8/16编码,才能替换!
我前面都说过了,11楼就有转换工具,你再看看。

点评

還是好難用,要轉編碼,又有逃逸字元等等,最重要的是,我還是轉不成功。  详情 回复 发表于 2020-6-10 19:42
回复

使用道具 举报

20#
发表于 2020-6-10 19:42:46 | 只看该作者
本帖最后由 guies 于 2020-6-10 19:47 编辑
2010hook 发表于 2020-6-10 18:26
你要把符号写成UTF8/Unicode编码,才能替换!
我前面都说过了,11楼就有转换工具,你再看看。

還是好難用,要轉編碼,又有逃逸字元等等,最重要的是,我還是轉不成功。以下只列出幾種,我是試了數十種不同指令,弄個搜尋取代比我寫小程式還難。
  1. rxrepl.exe --dir %cd% -I *.txt -a -s "%ProgramFilesDir(x64)%" -r "C:\\Program Files" --no-backup
  2. rxrepl.exe --dir %cd% -I *.txt -a -s "%%ProgramFilesDir(x64)%%" -r "C:\\Program Files" --no-backup
  3. rxrepl.exe --dir %cd% -I *.txt -a -s "%ProgramFilesDir\u0028x64\u0029%" -r "C:\\Program Files" --no-backup
  4. rxrepl.exe --dir %cd% -I *.txt -a -s "%%ProgramFilesDir\u0028\u0078\u0036\u0034\u0029%%" -r "C:\\Program Files" --no-backup
复制代码


回复

使用道具 举报

21#
发表于 2020-6-10 19:50:48 | 只看该作者
我用 fr 是這樣,只不過不支援 Unicode 大檔
就是先轉成 UTF-8 搜尋取代後再轉回 Unicode。
但再怎樣也方便多了,不需要去考慮其它。
  1. fr.exe *.txt -fic:"%%ProgramFilesDir(x64)%%" -t:"C:\Program Files" -frc
  2. fr.exe *.txt -fic:"%%ProgramFilesDir%%" -t:"C:\Program Files (x86)" -frc
  3. fr.exe *.txt -fic:"%%Common AppData%%" -t:"C:\ProgramData" -frc
  4. fr.exe *.txt -fic:"%%Fonts%%" -t:"C:\Windows\Fonts" -frc
  5. fr.exe *.txt -fic:"%%SystemSystem%%" -t:"C:\Windows\System32" -frc
  6. fr.exe *.txt -fic:"%%Program Files Common%%" -t:"C:\Program Files (x86)\Common Files" -frc
  7. fr.exe *.txt -fic:"%%Local AppData%%" -t:"%%LOCALAPPDATA%%" -frc
复制代码


点评

fr 不行  发表于 2020-6-10 20:31
回复

使用道具 举报

22#
 楼主| 发表于 2020-6-10 20:33:15 | 只看该作者

斜杠“\”是必须替换的符号,你为何保留“\\”?
没看仔细。

点评

經實測若要替換為 C:\Program Files 的話,一定要 C:\\Program Files 才可替換成功。 還有,還是算了不研究了,那麼多的符號,還要一個一個的去轉換再填進去, 那我不如轉UTF-8來的快。 不如你新建一個文字檔,用  详情 回复 发表于 2020-6-10 21:00
回复

使用道具 举报

23#
 楼主| 发表于 2020-6-10 20:44:43 | 只看该作者
本帖最后由 2010hook 于 2020-6-10 20:52 编辑
guies 发表于 2020-6-10 19:42
還是好難用,要轉編碼,又有逃逸字元等等,最重要的是,我還是轉不成功。以下只列出幾種,我是試了數十種 ...

我这是久经考验的写法,你看看差别在哪里:
  1. rxrepl.exe -f "2016.reg" -o "%Tmp%\2016.reg" -s "C:\x5c\x5c" -r "%SystemDrive%\x5c\x5c"
  2. rxrepl.exe -f "office.reg" -a -s "\x5cWOW6432Node" -r "" -s "Program Files\x20\x28x86\x29" -r "Program\x20Files" --no-backup
复制代码
回复

使用道具 举报

24#
发表于 2020-6-10 21:00:33 | 只看该作者
2010hook 发表于 2020-6-10 20:33
斜杠“\”是必须替换的符号,你为何保留“\\”?
没看仔细。

經實測若要替換為 C:\Program Files 的話,一定要 C:\\Program Files 才可替換成功。
還有,還是算了不研究了,那麼多的符號,還要一個一個的去轉換再填進去,
那我不如轉UTF-8來的快。
不如你新建一個文字檔,用rxrepl.exe把
%ProgramFilesDir(x64)%
換成
C:\Program Files
我想看看要怎麼寫,%ProgramFilesDir(x64)% 這一行中我要改掉多少字符去轉換,想起來就好麻煩。
回复

使用道具 举报

25#
 楼主| 发表于 2020-6-11 00:40:29 | 只看该作者
本帖最后由 2010hook 于 2020-6-11 01:15 编辑

你要先把路径变量中的符号转换成编码,再替换:
  1. @echo off
  2. pushd "%~dp0"

  3. echo %%ProgramFilesDir(x64)%%>"xxx.txt"
  4. rxrepl.exe -f "xxx.txt" -a -s "\x25ProgramFilesDir\x28x64\x29\x25" -r "C:\u005cProgram Files" --no-backup
  5. start "" "xxx.txt"

  6. md "新建文件夹" >nul 2>nul
  7. echo %%ProgramFilesDir(x64)%%>"新建文件夹\xxx.txt"
  8. rxrepl.exe -D "新建文件夹" -I "*.txt" -a -s "\x25ProgramFilesDir\x28x64\x29\x25" -r "C:\x5cProgram Files \u5f88\u597d \x21" -e utf8 --no-backup
  9. start "" "新建文件夹\xxx.txt"

复制代码

-s 后面必须符合Perl正则式语法!
-r 后面可以是各种编码混合。

点评

用這條命令成功了, 不過您想想,會用到批處理就是因為有多個需要取代的字串,而且會常常用到需要增減。 這種寫法,只要一個不注意,疏漏就會導致某個字串取代不成功, 當有多行時,也不會查覺到替換後那一個字  详情 回复 发表于 2020-6-11 10:57
回复

使用道具 举报

26#
发表于 2020-6-11 10:57:15 | 只看该作者
2010hook 发表于 2020-6-11 00:40
你要先把路径变量中的符号转换成编码,再替换:

-s 后面必须符合Perl正则式语法!


用這條命令成功了,
  1. rxrepl.exe --dir %cd% -I *.txt -a -s "\x25ProgramFilesDir\x28x64\x29\x25" -r "C:\\Program Files" --no-backup
复制代码
不過您想想,會用到批處理就是因為有多個需要取代的字串,而且會常常用到需要增減。
這種寫法,只要一個不注意,疏漏就會導致某個字串取代不成功,
當有多行時,也不會查覺到替換後那一個字串取代不成功。
這種不直覺的寫法風險太高,還要考慮如果數十數百行的每個字符必須先轉換好編碼。

如果只需要替換一次,那可以用Emeditor。

点评

你这条命令不够严谨,以后可能还会出错。  发表于 2020-6-11 15:02
记得查找的符号都转换就没问题了。  发表于 2020-6-11 15:01
回复

使用道具 举报

27#
 楼主| 发表于 2020-6-11 15:00:15 | 只看该作者
本帖最后由 2010hook 于 2020-6-11 15:20 编辑
guies 发表于 2020-6-11 10:57
用這條命令成功了,
不過您想想,會用到批處理就是因為有多個需要取代的字串,而且會常常用到需要增減 ...

Emeditor 好多年不用了,论查找替换PowerGREP比它强大多了,RegexBuddy也有部分GREP功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-20 06:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表