在第二个文件中展开一个文件

时间:2013-06-29 05:07:25

标签: powershell match expand

我有两个文件夹,其中保存.txt文件。

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

1 个答案:

答案 0 :(得分:1)

由于File1.txt包含替换字符串列表(我将假设每行以标识符字结尾),我建议将它们读入这样的哈希表:

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

-match operator匹配regular expression的字符串:

"string" -match 'expression'

结果匹配会自动存储在哈希表$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
  $_
}

其余的你必须弄清楚自己,因为这是你的功课,而不是我的。