1

.txt ファイルを保存するフォルダーが 2 つあります。

Folder1 has File1.txt
Folder2 has File2.txt

の内容File1.txt

Some text
    ABCD123X Execute String1
Some text

の内容File2.txt

String1 Procedure
ABCD
EFGH

出力:

Some text
    ABCD123X Execute String1

    ABCD
    EFGH

Some text

要件 :

File2.txt で'Execute String1'パターンを見つけたら、File1.txt 自体を展開したい'String1 Procedure'

これは私がこれまでに試したことです:

$string1 = $null
gc $file.fullname | ? {
  if ($_ -match "(.*)EXECUTE(\s)([A-Za-z_0-9][^ |^,]*)" -and $_ -notmatch "^\/\/*") {
    $string1 = $matches[3]
  } elseif ($string1 -ne $null) {
    get-content file.fullname, $string1.fullname | out-file $combined.txt
    # This is appending string1.txt file at end of file.txt
  } 
}

string1.txt を file.txt の末尾ではなく、見つけた場所のすぐ下の位置に追加する方法が必要です。このような :

Some text
ABCD123X Execute String1
ABCD
EFGH
Some text
4

1 に答える 1

1

置換文字列のリストが含まれているためFile1.txt(各行が識別子単語で終わると仮定します)、次のようにそれらをハッシュテーブルに読み込むことをお勧めします。

$replacements = @{};
Get-Content "C:\path\to\File1.txt" | ? { $_ -match '.* (\S+)$' } | % {
  $replacements[$matches[1]] = $matches[0]
}

この-match演算子は、文字列を正規表現と照合します。

"string" -match 'expression'

結果の一致は、自動的に hashtable に格納されます$matches。例:

PS C:\> "ABCD123X Execute String1" -match '.* (\S+)$'
True
PS C:\> $matches

Name                           Value
----                           -----
1                              String1
0                              ABCD123X Execute String1

これで、一致全体 ( ) を取得し、最初の部分一致 (正規表現の括弧の間の部分) をこの値のキーとして使用$matches[0]してハッシュテーブルに入れます。$replacements$matches[1]

$replacements[$matches[1]] = $matches[0]
       ^          ^              ^
   hashtable     key           value

ハッシュテーブルは基本的に、キーワードでフレーズを検索できる辞書です。例:

PS C:\> $phonebook = @{
>> "Amy" = "555-1234";
>> "Eve" = "555-6666";
>> "Ivy" = "555-4223";
>> }
>>
PS C:\> $phonebook

Name                           Value
----                           -----
Amy                            555-1234
Eve                            555-6666
Ivy                            555-4223

PS C:\> $phonebook["Mia"] = "555-1327"
PS C:\> $phonebook

Name                           Value
----                           -----
Amy                            555-1234
Eve                            555-6666
Ivy                            555-4223
Mia                            555-1327

PS C:\> "Amy's number is: " + $phonebook["amy"]
Amy's number is: 555-1234

あなたの場合、辞書にはキーとして識別子の単語(「String1」など)が含まれ、キーに関連付けられた値としてフレーズ全体(「ABCD123X Execute String1」)が含まれています。

このハッシュテーブルを使用すると、次のように置換できますFile2.txt

if { $_ -match '^(\S+) procedure' } {
  # print the phrase from the $replacements hashtable if a matching line is found
  $replacements[$matches[1]]
} else {
  # otherwise print the original line
  $_
}

これはあなたの宿題であって、私の宿題ではないので、あとはあなたが自分で解決しなければなりません。

于 2013-06-29T09:49:37.707 に答える