将两个字符串中的文本转换为基于找到的文本命名的单独的新文件

时间:2019-11-12 10:00:29

标签: regex powershell

我有一个文件,其中有很多文本,其格式如下:

SOME STRING1 some text in the same line SOME STRING2  
lot of text in multiple lines~  

我想实现什么?

  1. 我需要提取SOME STRING1和符号~之间的每个文本块
  2. 文件名应为STRING1STRING2之内的文本。

我能够提取文本块,但是我不知道如何根据下一个模式将它们写入单独的文件中。

$txtfile = gc -Raw '.\mytxt.txt'
$output = $txtfile | select-string -AllMatches '(?i)some\s+string1(.|\n)*?~'
$output.Matches

在“匹配”上的每个循环中寻找值的A都会给出匹配的模式。但是我无法弄清楚如何通过再次查看匹配的模式以找到具有SOME STRING 1和SOME STRING 2的文本来将每个匹配的模式写入单独的文件。

以下是示例文本:

SOME STRING1 bqo_cha.paliuni_cdr SOME STRING2
 paliunipaliuni_cdr.bgr, paliuni_cdr.vdr
   KEY jaja.paliuni_cdr~

SOME STRING1 bqo_cha.ytr SOME STRING2
SOME STRING1 bqo_cha.ytr SOME STRING2 paliuni KEY jaja.ytr ~

SOME STRING1 bqo_cha.unipali_bfrentmng SOME STRING2
 paliuniunipali_bfrentmng.ngt
   KEY jaja.unipali_bfrentmng~

SOME STRING1 bqo_cha.unipali_iliwi SOME STRING2
 paliuniunipali_iliwi.iliwi_jhwity
  KEY jaja.unipali_iliwi~

1 个答案:

答案 0 :(得分:1)

使用(.|\n)之类的否定字符集代替在[^~]上进行匹配-然后显式获取捕获组中的第一部分(文件名):

$output = $txtfile|Select-String -AllMatches '(?i)some\s+string1\s*(?<value>(?<filename>.*)\s*some\s+string2[^~]*)~'
foreach($match in $output.Matches){
  $Filename = $match.Groups['filename'].Value.Trim()
  $Value = $match.Groups['value'].Value
  Set-Content -Path $Filename -Value $Value
}