我有一个文件,其中有很多文本,其格式如下:
SOME STRING1 some text in the same line SOME STRING2
lot of text in multiple lines~
我想实现什么?
SOME STRING1
和符号~
之间的每个文本块STRING1
和STRING2
之内的文本。我能够提取文本块,但是我不知道如何根据下一个模式将它们写入单独的文件中。
$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~
答案 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
}