0

我目前正在尝试在 Linux Mint 上编辑完整的转储 .reg 文件。目标是在值中找到给定路径,然后打印出相应的 regpath 键和完整值本身。

我知道我可以在 grep 或 sed 中使用正则表达式模式来实现这一点,不幸的是我对命名程序很陌生。

这是一个示例:我正在搜索 C:\\ProgramData

[HKEY_LOCAL_MACHINE\...]
"noPath0"="1.1.9103.0"
"path0Key"="C:\\ProgramData\\..."
"noPath1"="2.1.9103.0"
"path1Key"="...C:\\ProgramData\\..."

[HKEY_LOCAL_MACHINE\...]
"noPath0"=dword:00000000

输出应如下所示:

[HKEY_LOCAL_MACHINE\...]
"path0Key"="C:\\ProgramData\\..."
"path1Key"="...C:\\ProgramData\\..."

我已经弄清楚了以下两个 regexPattern:

Regpath: ^\[.[^\]]*\n
Key+Value: .*C\:\\\\ProgramData.*

问题是如何结合这两种模式并在 grep 或 sed 中使用它们,或者更适合此任务的方法?

4

2 回答 2

1

sed 脚本将是一种更优雅的方式,但对于快速而肮脏的解决方案,我会编写一个脚本,在您的第一个正则表达式上运行 csplit,然后在每个拆分文件上使用第二个正则表达式运行 grep。IE

if exist xx* del /q xx*
csplit myfile.reg.txt /^\[/ {*}
for %%f in (xx*) do call :search %%f

goto :EOF

:search

grep ".*C\:\\\\ProgramData.*" %1 >nul
if not "%errorlevel%"=="0" goto :EOF
grep "^\[\|.*C\:\\\\ProgramData.*" %1 
goto :EOF
于 2013-02-18T17:06:30.367 回答
0

由于 ty733420 的帮助,我能够创建一个 bash 脚本来完成工作......真的很慢......但至少它有效:

#!/bin/bash

#: <<'COMMENT'
if [ -e xx00 ]; then
    rm xx*
fi
csplit -s ./regBackup.reg.txt "/^\[/" '{*}'

for name in $(ls xx*) 
do
    #echo $name
    if grep '.*C\:\\\\Program Files.*' $name > /dev/null; then
        grep '^\[.*' $name
        grep '.*C\:\\\\Program Files.*' $name
        echo ""
    fi
done
exit 0

./sedS.sh > out.txt

感谢您的帮助 ty733420 :)

如果有人知道如何加快这项任务,我将不胜感激。

于 2013-02-19T01:12:22.280 回答