我有两个文件夹,其中保存.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
答案 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
$_
}
其余的你必须弄清楚自己,因为这是你的功课,而不是我的。