[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell使用正则将多行文本中的键值整理出来

我想把
sss A=
Key 1
sss Av=
Hello 1
World 1

Av.fff

sss B=
Key 2
sss Bv=
Hello 2

World 2

Bv.fff

sss C=
Key 3
sss Cv=
Hello 3
World 3

Cv.fff

sss kv=
@
{A}={Av}
{B}={Bv}
{C}={Cv}
DDD(kv)

把上面的红色字整理出去,红色字内容是变化的, 但是它所在的位置不变,
整理为:
Key 1
-
Hello 1
World 1
---
Key 2
-
Hello 2

World 2
---
Key 3
-
Hello 3
World 3


键和值之前用 - 分开
键值对儿之间用 --- 分开

写了下面的代码, 遇到了正则匹配问题,

我的想法是用两个括号分别匹配住键和值的内容, 然后再整理, 但是括号就是匹配不上,

请路过大佬支招, 谢谢
  1. $s = @'
  2. sss A=
  3. Key 1
  4. sss Av=
  5. Hello 1
  6. World 1
  7. Av.fff
  8. sss B=
  9. Key 2
  10. sss Bv=
  11. Hello 2
  12. World 2
  13. Bv.fff
  14. sss C=
  15. Key 3
  16. sss Cv=
  17. Hello 3
  18. World 3
  19. Cv.fff
  20. sss kv=
  21. @
  22. {A}={Av}
  23. {B}={Bv}
  24. {C}={Cv}
  25. DDD(kv)
  26. '@
  27. $rx = [regex]'sss [A-Z]=\r\n(.+)\r\nsss [A-Z]v=(?s)(.+)?[A-Z]v.fff'
  28. $rx.Matches($s).Value
复制代码

回复 19# 小白龙


   
俺不知道你前面的exe文件是什么应用,下面用type做示例:
  1. for /f "tokens=*" %%a in ('type 1.txt^|gawk -f.\1.awk') do @echo;%%a
复制代码

TOP

回复 18# hfxiang


感谢大佬,

我的意思是, 要处理的字符串, 是前面管道来的, 想直接处理, 不想存成文件再处理

TOP

回复 3# 小白龙


   
调用示例
  1. for /f "tokens=*" %%a in ('gawk -f.\1.awk 1.txt') do @echo;%%a
复制代码

TOP

回复 16# idwma

感谢大佬, 正则水平太6了

TOP

回复 15# 小白龙
  1. $s -replace '(?s)sss (.)=\s*(.+)\s*sss \1v=\s*(.+)\s*\1v.fff\s*',"`$2-`r`n`$3---`r`n" -replace '(?s)\s*---\s*sss kv=.+|(?m)^ +'
复制代码

TOP

回复 7# idwma


  大佬, 不用 (\k<a>) 这个方法可以实现吗? 这个正则我在另一个软件中, 它不支持这个特性, 只支持 $1 $2 这种数字格式

TOP

回复 13# 小白龙

正则用法灵活呀,不用过于纠结合不合理

TOP

本帖最后由 小白龙 于 2022-11-21 20:34 编辑

回复 7# idwma


    大佬你好, 看了正则的资料后, 对(?s)还是搞不懂, 按理说, 它是放在正则前面的, 表示单行模式,

但是下面的例子中, 它是放在中间的,很少有资料介绍到这种情况

零星的资料解释说, 这是让.能匹配到\s空字符了
更搞不明白的是, 4楼的大佬, 正则的开头出现了(?sm) 这是什么意思, 单行和多行模式还能混在一起玩吗?
  1. $s = @'
  2. public static
  3. {
  4. #if A
  5.     part1
  6. #endif
  7. part
  8. part
  9. #if V
  10.     part2
  11. #endif
  12. part
  13. part
  14. #if C
  15.     part3
  16. #endif
  17. }
  18. '@
  19. $rx = [regex]'#if.*(?s)(.*?)#endif'
  20. $rx.Matches($s) |
  21. %{
  22. $_.Groups[1].Value
  23. }
复制代码

TOP

回复 10# idwma


   多谢大侠的链接, 以前在PS官网真没找到这么细的资料

TOP

回复 4# xczxczxcz


   大佬,  能请教一下吗? 下面这两行什么意思, 我powershell官网搜索也没有找到, 只有(?m) (?s)

(?sm)

(?is)

TOP

回复 9# 小白龙

文档里都有说明呀,看不懂的地方多搜点例子多看几个就会了
  1. https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expression-language-quick-reference
复制代码

TOP

本帖最后由 小白龙 于 2022-11-20 18:47 编辑

回复 7# idwma


大佬请教一下

(?s)
这个是什么意思? 是单行模式吗? 我记得有的地方还说, 这是打开 .匹配空白符的模式

<a>
这个什么意思, 没见过

\k
是什么

我敢说, 没有几年功力, 真写不出您这正则, 真是看不懂

TOP

回复 7# idwma

大佬666,

说实话, 您写的这正则, 我一看就晕了

TOP

正则非常通用呀,用多就会了
  1. $s -replace '(?s)sss (?<a>.)=\s*(.+)\s*sss (\k<a>)v=\s*(.+)\s*(\k<a>)v.fff\s*',"`$1-`r`n`$3---`r`n" -replace '(?s)\s*---\s*sss kv=.+|(?m)^ +'
复制代码
1

评分人数

TOP

返回列表