Board logo

标题: [文本处理] 【已解决】sed.exe替换字符,还能够精简吗?谢谢 [打印本页]

作者: yyz219    时间: 2025-3-14 09:50     标题: 【已解决】sed.exe替换字符,还能够精简吗?谢谢

本帖最后由 yyz219 于 2025-3-15 10:14 编辑

完美解决了:
方法1
::去 SID(任意位数的 SID 都适用)
  1. sed.exe -i -E "s/HKEY_USERS\\S-1-5-21[^\\]*\\/HKEY_CURRENT_USER\\/g" "%注册表文件路径%"
复制代码
方法2
  1. ::去 SID(任意位数的 SID 都适用)【S-1-5-21后面由 “数字” 和 “-” 号组成,由此用:[0-9\-]】
  2. sed -i -E "s/HKEY_USERS\\S-1-5-21[0-9\-]*\\/HKEY_CURRENT_USER\\/g" "%注册表文件路径%"
复制代码
=================================================================
成品.bat
:
  1. :【自动去 sid(拖动)】【转换成的(.reg)是(ANSI 编码)】
  2. @echo off
  3. ::=============================================================================================
  4. ::【双击退出,拖运行】
  5. if "%~1"=="" exit /b 3
  6. ::=============================================================================================
  7. set 注册表文件路径=%~1
  8. ::=============================================================================================
  9. ::【检测 “关键字”:HKEY_USERS\S-1-5-21(有跳到:D,无跳到:C)】
  10. type "%注册表文件路径%"|findstr "HKEY_USERS\S-1-5-21" >nul 2>&1
  11. if %errorlevel% equ 0 (goto :D) else goto :C
  12. :C
  13. echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo. %【留下 10个 空行】%
  14. echo                                  不需要替换
  15. pause>nul
  16. exit
  17. :D
  18. echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo.&echo. %【留下 10个 空行】%
  19. echo                                   要替换吗?
  20. pause>nul
  21. ::=============================================================================================
  22. ::【转为:ANSI 编码(才不乱码)】
  23. (type "%注册表文件路径%" &echo.;需有中文)>>"ANSI.#" &move /y "ANSI.#" "%注册表文件路径%">nul
  24. ::=============================================================================================
  25. ::去 SID(任意位数的 SID 都适用)【S-1-5-21后面由 “数字” 和 “-” 号组成,由此用:[0-9\-]】
  26. sed -i -E "s/HKEY_USERS\\S-1-5-21[0-9\-]*\\/HKEY_CURRENT_USER\\/g" "%注册表文件路径%"
  27. exit
复制代码
===============================
原来的问题:
sed.exe替换字符,还能够精简吗?谢谢
========================
sed.exe替换字符.bat
这些代码能够使用。但是,觉得行数有一点多,不知道能不能减少?
::【自动去 sid】
@echo off
... ...
::====================================================================
::去 "注册表文件"中的SID(数字和 “.” 的位数  要等于sid的位数  不等于就不会处理)(下面sid-40~48位适用
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21.................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21..................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21...................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21....................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21.....................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21......................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21.......................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"
sed.exe -i -E -e "s/HKEY_USERS\\S-1-5-21........................................\\/HKEY_CURRENT_USER\\/g"  "%注册表文件路径%"

exit
====================================================================
这些代码能够使用。但是,觉得行数有一点多,不知道能不能减少?
贴个注册表文件,供测试

Windows Registry Editor Version 5.00

[HKEY_USERS\S-1-5-21-2765962963-2952424663-14726149-500\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband]
[HKEY_CURRENT_CONFIG\Software\Fonts]
"LogPixels"=dword:00000060
作者: fzp070    时间: 2025-3-14 11:57

代码精简不清楚,不过注册表的五大根键名,可以采用缩写,如下
HKEY_LOCAL_MACHINE    简写HKLM
HKEY_CURRENT_USER     简写HKCU
HKEY_CLASSES_ROOT     简写HKCR
HKEY_USERS                  简写HKU
HKEY_CURRENT_CONFIG 简写HKCC
作者: yyz219    时间: 2025-3-14 12:01

回复 2# fzp070


    谢谢
作者: aloha20200628    时间: 2025-3-14 12:56

本帖最后由 aloha20200628 于 2025-3-14 13:09 编辑

回复 1# yyz219

假设被替换的32-40字符链仅由数字和.构成
  1. sed -E "s/HKEY_USERS\\S-1-5-21[0-9\.]{32,40}\\/HKEY_CURRENT_USER\\/ig" "%注册表文件路径%"
复制代码
【修改注册表须谨慎】

作者: yyz219    时间: 2025-3-14 17:50

回复 4# aloha20200628


    我试一试先 谢谢
作者: yyz219    时间: 2025-3-14 18:06

回复 4# aloha20200628

不成功(没有进行替换)
作者: yyz219    时间: 2025-3-14 19:05

贴个注册表文件,供测试

Windows Registry Editor Version 5.00

[HKEY_USERS\S-1-5-21-2765962963-2952424663-14726149-500\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband]
[HKEY_CURRENT_CONFIG\Software\Fonts]
"LogPixels"=dword:00000060
作者: aloha20200628    时间: 2025-3-14 19:26

本帖最后由 aloha20200628 于 2025-3-14 19:32 编辑

回复 7# yyz219

提供的样本文件中的 32-40字符链包含的不是.字符而是-字符,故4楼代码须订正如下
  1. sed -E "s/HKEY_USERS\\S-1-5-21[0-9\.\-]{32,40}\\/HKEY_CURRENT_USER\\/ig" "%注册表文件路径%"
复制代码
如果要被替换的这段32-40字符链仅包含数字和.-这两个非数值字符,亦可用以下代码,其自动兼容 1-n 个字符长度...
  1. sed -E "s/HKEY_USERS\\S-1-5-21[0-9\.\-]+\\/HKEY_CURRENT_USER\\/ig" "%注册表文件路径%"
复制代码

作者: yyz219    时间: 2025-3-14 19:30

回复 8# aloha20200628


    一样不行(没有替换),是不是跟“S-1-5-21”————有一个“S”有关系
作者: aloha20200628    时间: 2025-3-14 19:40

回复 9# yyz219

代码中匹配的是 S-1-5-21 其后的 -2765962963-2952424663-14726149-500 字符链,我测试没有问题。

作者: smss    时间: 2025-3-14 19:45

  1. sed.exe -i -E "s/HKEY_USERS\\S-1-5-21[^\\]*\\/HKEY_CURRENT_USER\\/g" "%注册表文件路径%"
复制代码

作者: yyz219    时间: 2025-3-14 19:46

回复 10# aloha20200628


    代码是什么?
作者: yyz219    时间: 2025-3-14 19:47

回复 11# smss

我试一试 谢谢
作者: yyz219    时间: 2025-3-14 19:51

回复 11# smss


    成功了,再次感谢
作者: aloha20200628    时间: 2025-3-14 19:51

回复 12# yyz219

直接在命令行测试以下这行,看看是啥结果?
  1. C:\temp>echo,[HKEY_USERS\S-1-5-21-2765962963-2952424663-14726149-500\Software\Microsoft\Windows\CurrentVersion\Explorer\Taskband]|sed -E "s/HKEY_USERS\\S-1-5-21[0-9\.\-]+\\/HKEY_CURRENT_USER\\/ig"
复制代码

作者: aloha20200628    时间: 2025-3-14 20:07

本帖最后由 aloha20200628 于 2025-3-14 20:13 编辑

回复 9# yyz219

这段正则匹配式很简单([0-9\.\-] 与 [^\\] 对匹配本帖是同效的),但楼主的测试结果成否表明与是否采用 -i 参数有关?这也许与 sed.exe 版本 ... 本人用的是从本坛第三方下载的 sed 4.9版 sed (GNU sed) 4.9

作者: yyz219    时间: 2025-3-14 20:19

回复 15# aloha20200628


    谢谢 辛苦了 谢谢
作者: yyz219    时间: 2025-3-14 21:39

本帖最后由 yyz219 于 2025-3-14 21:49 编辑

回复 16# aloha20200628

下面代码成功,谢谢
  1. ::去 SID(任意位数的 SID 都适用)
  2. sed -i -E "s/HKEY_USERS\\S-1-5-21[0-9\-]*\\/HKEY_CURRENT_USER\\/g" "%注册表文件路径%"
复制代码

作者: aloha20200628    时间: 2025-3-15 12:06

本帖最后由 aloha20200628 于 2025-3-15 12:13 编辑

回复 18# yyz219

是的...其实就差一个参数 -i,不用此参数就不会自动修改源文件,须用重定向文件才可保存修改结果,用此参数即可直接修改源文件... 解答论坛各类问题要分门别类的选用相应的脚本和命令行工具,对这些五花八门的命令行参数真得细心 ‘管理’,跟大厨料理各式菜品,中医熟记各式药方一样 ...

作者: yyz219    时间: 2025-3-15 12:37

回复 19# aloha20200628


    谢谢你的帮助 谢谢




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2