0

現在、LinuxMintで完全なダンプ.regファイルを編集しようとしています。目標は、値から特定のパスを見つけてから、対応するregpathキーと完全な値自体を出力することです。

私は、grepまたはsedの正規表現パターンを使用してこれを達成できることを知っています。残念ながら、私は名前付きプログラムにかなり慣れていません。

ここに1つの例があります:私は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\\..."

私は次の2つのregexPatternを理解しました:

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

問題は、両方のパターンをどのように組み合わせて、grepまたはsedで使用するか、またはこのタスクにより適したものを使用するかです。

4

2 に答える 2

1

sed スクリプトの方がより洗練された方法ですが、迅速かつ汚い解決策として、最初の正規表現で csplit を実行し、各分割ファイルで 2 番目の正規表現を grep するスクリプトを作成します。すなわち

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 に答える