仅获取预设数量的斜线之间的数据的正则表达式和 Powershell

Regex and Powershell that gets only data between a pre set number of slashes

假设我有如下一行:

/a/b/c/d/e/f/g/h/

我需要获取第 2 条和第 5 条斜线之间的数据,但希望在代码之间定期控制此选择。

这样,第二个和第五个子字符串将是 /b/c/d/

所以我尝试了:$ cat test.txt | gawk '/\/{2}(.*?)\/{5}/{print [=12=]}' 但没有成功。我需要一个适用于正则表达式和 powershell 的工作代码行。

能否请您尝试以下(仅使用提供的示例编写和测试)。

awk 'BEGIN{FS=OFS="/"}{for(i=3;i<=5;i++){val=(val?val OFS:"")$i};print OFS val;val=""}'  Input_file

使用 GNU awkgensub 方法,可以尝试遵循以下方法。

awk 'BEGIN{regex="/([a-zA-Z]+)/(([a-zA-Z]/){3}).*"} {print gensub(regex, "/\2", "1",[=11=])}' Input_file


更多通用: 更改最小值和最大值并根据需要获取输出。

awk -v min=2 -v max="5" '
BEGIN{
  FS=OFS="/"
  regex="^/(([a-zA-Z]/+){"(max-1)"}).*"
}
{
  val=gensub(regex, "/\1", "1",[=12=])
  num=split(val,array,"/")
  for(i=min+1;i<=(num-1);i++){
    value=(value?value:"")OFS array[i]
  }
  print value
  value=""
}
'   Input_file

使用 PowerShell,-replace 可以执行该作业。 -replace 运算符使用正则表达式作为其匹配机制。

'/a/b/c/d/e/f/g/h/' -replace "(/[^/]+){1}((/[^/]+){3}/).*",''

-split-join 也可以完成这项工作。

"/{0}/" -f (('/a/b/c/d/e/f/g/h/' -split "/")[2..4] -join "/")

对于直接的 PowerShell 正则表达式匹配,您可以使用以下内容:

([regex]"(?<=(/[^/]+){1})(/[^/]+){3}/").Match('/a/b/c/d/e/f/g/h/').Value

上述任何技术都可以从变量中获取输入或读取文件,如下所示:

# Using a variable
$str = '/a/b/c/d/e/f/g/h/'
$str -replace "(/[^/]+){1}((/[^/]+){3}/).*",''
/b/c/d/

# Reading from a file
([regex]"(?<=(/[^/]+){1})(/[^/]+){3}/").Match((Get-Content File.txt)).Value
/b/c/d/