RegEx 在 Powershell 中匹配两个字符串之间的字符串

2023-12-13

这是我的示例数据:

选项失败不匹配
选项批处理开启
选项确认关闭
打开 sftp://用户名:[电子邮件受保护]:22 主机密钥=“ssh-rsa 1024” 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00"

获取 File*.txt \local\path\Client\File.txt
mv 文件*.txt /remote/archive/

close
exit

我想创建一个 powershell 脚本来从此文本文件中提取信息。

我需要的物品清单:

  • Username
  • 密码
  • Host
  • Port
  • ssh key
  • 文件名
  • 本地路径
  • 远程路径

我希望如果我学会了如何做其中几个,该方法将适用于所有项目。我尝试使用以下 powershell/regex 提取 ssh 密钥:

$doc -match '(?<=hostkey=")(.*)(?=")' 

$doc 是示例数据

但它似乎正在返回整行。任何帮助将不胜感激。谢谢。


If -match正在返回一个全线,其含义是你的左手边-match操作是一个array,这反过来表明您使用过Get-Content without -Raw,它产生的输入为array of lines, 在这种情况下-match充当filter.

相反,将文件作为单个多行字符串读取Get-Content -Raw; with a scalar LHS,
-match然后返回一个[bool]
,以及匹配操作的结果在自动变量中报告$Matches(一个哈希表,其0条目包含整体匹配,1第一个捕获组匹配的内容,...):

# Read file as a whole, into a single, multi-line string.
$doc = Get-Content -Raw file.txt 

if ($doc -match '(?<=hostkey=")(.*)(?=")') {
   # Output what the 1st capture group captured
   $Matches[1]
}

根据您的示例输入,上面的结果是
ssh-rsa 1024 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00


然后,您可以扩展该方法来捕获多个令牌,在这种情况下我建议using named捕获组 ((?<name>...));以下示例使用此类命名捕获组来提取多个感兴趣的标记:

if ($doc -match '(?<=sftp://)(?<username>[^:]+):(?<password>[^@]+)@(?<host>[^:]+)'){
  # Output the named capture-group values.
  # Note that index notation (['username']) and property
  # notation (.username) can be used interchangeably.
  $Matches.username
  $Matches.password
  $Matches.host
}

根据您的示例输入,上面的结果是:

username
password
host.name.net

您可以扩展上面的内容来捕获all利息代币。
注意.默认情况下不匹配\n(换行)字符。


可选阅读:使用x (IgnoreWhiteSpace) 选项使正则表达式更具可读性:

提取如此多的标记可能会导致难以阅读的复杂正则表达式,在这种情况下x (IgnoreWhiteSpace)正则表达式选项,可以提供帮助(作为内联选项,(?x)在正则表达式的开头):

if ($doc -match '(?x)
    (?<=sftp://)(?<username>[^:]+)
    :(?<password>[^@]+)
    @(?<host>[^:]+)
    :(?<port>\d+)
    \s+hostkey="(?<sshkey>.+?)"
    \n+get\ File\*\.txt\ (?<localpath>.+)
    \nmv\ File\*\.txt\ (?<remotepath>.+)
  '){
    # Output the named capture-group values.
    $Matches.GetEnumerator() | ? Key -ne 0
}

请注意如何使用空格使正则表达式更具可读性(将其分布在多行中)ignoredwhile 匹配时,而输入中要匹配的空格必须是escaped(例如,要匹配单个空格, or [ ], or \s匹配任何空白字符。)

根据您的示例输入,上面的结果如下:

Name                           Value
----                           -----
host                           host.name.net
localpath                      \local\path\Client\File.txt
port                           22
sshkey                         ssh-rsa 1024 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
remotepath                     /remote/archive/
password                       password
username                       username

请注意,捕获组乱序的原因是$Matches is a 哈希表(类型[hashtable]),其关键枚举顺序是一个实现工件:不保证特定的枚举顺序。

然而,随机访问捕获组效果很好;例如。,$Matches.port将返回22.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RegEx 在 Powershell 中匹配两个字符串之间的字符串 的相关文章

随机推荐

  • 从c#中查找msform上的所有控件

    我正在尝试使用 VBA 可扩展性互操作从 c 查找 msform 上的所有控件 我可以使用以下方式找到所有表格 using System using Microsoft Office Interop Excel using Microsof
  • 如何使用 Python Urwid 制作类似聊天的 UI? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我已经可以使用 gevent 和 Zeromq 实现聊天守护进程 但我想为它们制作一个控制台 UI 我第一次尝试 ncurses 失败了 所以我尝试了Urwid并发现该项目nig
  • 用Java制作数字时钟

    我正在为一个项目制作一个数字时钟 我有四个课程 DigitalTimeUI 这是 JFrame 类 TitlePanel DigitPanel and ColonPanel 它们是所述项目的 JPanel 完成后 它应该看起来像这样 我坚持
  • 无法让 selenium webdriver 在 azure databricks 中工作

    我们有一些 python 脚本可以抓取网站并且运行良好 现在我们想在 Azure Databricks 中执行此操作 我们认为我们可以通过 Databricks 论坛中的以下帖子找到解决方案 但不幸的是 它不起作用 https forums
  • 将两个 datagridview 列合并为一个新列

    我想将两个 datagridview 列合并为一个新列 我首先将两个 col 的 Visible 属性更改为 false 然后尝试添加新的 col 该值必须格式化为以下 col1 Value 基金 col2 Value 是以上列的值 str
  • Ubuntu 中的 .gradle 目录在哪里?

    在 Windows 中 它是 C Users me gradle 但是Ubuntu呢 它在不同的位置吗 如果是的话 在哪里 我到处寻找但找不到它 它应该位于 HOME gradle gradle 和 或 项目特定
  • 如何将我的应用程序添加到 Android 默认拨号器选择中?

    我的问题是如何将我的应用程序添加到 android 默认拨号器选择中 更具体地说 而不使用 android intent action CALL PRIVILEGED 现在我正在使用下面的代码 效果很好
  • 从 React TypeScript 组件调用外部 Javascript 函数

    我有一个带有打字稿的 React Redux 应用程序 所以场景是这样的 我有一个包含一些javascript的index cshtml文件 现在 在我的 React 组件上 在 componentWillMount 函数的 Main ts
  • 使用 savefiledialog 保存图像时出现问题

    我正在使用 savefiledialog 来保存图像 画布是图片框 加载的图像是位图 当我尝试保存它时 文件已创建 但不知何故已损坏 因为当我尝试再次加载图像或在不同的查看器中显示时它不起作用 我的意思是保存的文件已损坏 有一种保存图像的方
  • 这个 LLVM 1.5 警告是什么意思? “没有‘id’的协议限定符已经过时了”

    我刚刚尝试使用 LLVM 1 5 编译器 包含在 XCode 3 2 3 中 编译 iOS 项目 并且收到了很多新警告 其中包括以下几个警告 protocol qualifiers without id is archaic 例如 这发生在
  • 标准化矩阵行,使其范数等于 1 (MATLAB)

    我有一个以下问题 我有一个矩阵A尺寸为 16x22440 我需要做的是对该矩阵的每一行进行归一化 使每行的范数等于 1 for n 1 16 norm A n 1 我怎样才能在matlab中实现这一点 编辑 该矩阵中的每一行都是由 160x
  • D3 径向树状图仅显示部分

    我根据 Mike Bostock 在 Observable 中的示例创建了下面的代码 我知道它与原始 d3 javascript 不同 https observablehq com d3 radial dendrogram 然而 它 仅当我
  • ios编程:使用线程将多个图像添加到库中

    在 Xcode 中 当我尝试添加超过 5 张图片到我的图书馆 它给了我以下错误 Error Domain ALAssetsLibraryErrorDomain Code 3301 Write busy UserInfo 0xa706aa0
  • 如何在 Today 扩展中发送和接收数据

    我想开发一个具有通知中心小部件的 iOS 应用程序 但我不知道应该如何在视图控制器和今日扩展之间发送和接收数据 传递数据 我尝试使用结构 但它不起作用 而且我也使用了应用程序组 但我不想使用这种方法 let shared NSUserDef
  • 以编程方式禁用 Android 中软输入键盘上的语音转文本按钮(麦克风)

    先谢谢您的帮助 我正在开发一个用于研究目的的 Android 应用程序 需要禁用软输入键盘上的语音到文本按钮 其原因是由于我正在开发的应用程序使用麦克风而出现并发问题 我知道对于一般应用程序来说 禁用按键通常被认为是不可能的 因为用户可能会
  • 使用 Spring Reactor 时为什么要使用断路器和隔板?

    请帮助我找到断路器和隔板模式在 Spring Reactor 应用程序中有用的原因 由于 Reactor 中的操作将是非阻塞的 并且这两种模式旨在节省对资源 主要是线程 的潜在影响 因此在什么情况下我可以使 Spring Reactor 应
  • 如何“独立”使用PolicyHttpMessageHandler?

    我只是想创建一个简单的测试 我使用DelegateHandlers实例化一个HttpClient无需带Asp net Core包 我有 2 个删除处理程序 ThrottlingDelegatingHandler PolicyHttpMess
  • 如何在闪亮中设置两个相关输入值(滑块和数字)的初始值?

    我已经在我闪亮的应用程序中定义了两个互连或相互依赖的输入 现在 我的问题是为这些滑块和数字输入设置特定的初始值 似乎他们总是从最小值开始 即使我现在也不知道为什么 如何指示这些输入参数的唯一起点或初始值 我附上了我的应用程序的简化部分 以便
  • 屏幕关闭时检测手机移动

    我正在开发一个应用程序 它应该检测用户的移动 当他停止超过 5 分钟时 它应该发出警报 我能够使用加速度计检测运动 但问题是屏幕关闭时它不起作用 我也尝试过使用部分wakeLock 重新注册加速度计也不起作用 这应该是摩托罗拉设备的解决方法
  • RegEx 在 Powershell 中匹配两个字符串之间的字符串

    这是我的示例数据 选项失败不匹配选项批处理开启选项确认关闭打开 sftp 用户名 电子邮件受保护 22 主机密钥 ssh rsa 1024 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 获取