仅获取预设数量的斜线之间的数据的正则表达式和 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 awk
的 gensub
方法,可以尝试遵循以下方法。
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/
假设我有如下一行:
/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 awk
的 gensub
方法,可以尝试遵循以下方法。
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/