gpt4 book ai didi

regex - 使用 sed 仅获取捕获组中的字母数字字符

转载 作者:行者123 更新时间:2023-12-05 08:29:22 25 4
gpt4 key购买 nike

输入:

x.y={aaa b .c}

请注意,{} 中的内容只是一个示例,实际上它可以是任何值。

问题:我只想保留 {} 中的字母数字字符。

所以它会来:

x.y={aaabbc}

试验 0

$ echo 'x.y={aaa b .c}' | sed 's/[^[:alnum:]]\+//g'
xyaaabc

这很好,但我只想修改 {} 中的部分。所以我认为这可能需要捕获组,因此我继续尝试了这些:

试验 1

$ echo 'x.y={aaa b .c}' | sed -E 's/x.y=\{(.*)\}/x.y={\1}/'
x.y={aaa b .c}

在这里,我已经正确捕获了我想要修改的内容 (aaa b .c),但是我需要一种方法来以某种方式执行 s/[^[:alnum:]]\+//g 仅在 \1 上。

相反,我尝试只捕获所有字母数字字符(到\1),如下所示:

试验 2

$ echo 'x.y={aaa b .c}' | sed -E 's/x.y=\{([[:alnum:]]+)\}/x.y={\1}/'
x.y={aaa b .c}

当然,它不起作用,因为我只是期待 alnum,然后立即是一个} 文字。我没有告诉它忽略非校友的。即,这部分:

s/x.y=\{([[:alnum:]]+)\}/x.y={\1}/
^^^^^^^^^^^^^^^^^^

它确实匹配:一个左大括号、一些 alnum 和一个右大括号——这不是我想要的。我希望它匹配所有内容,但只捕获校友的


输入/输出示例:

x.y={aaa b .c} blah
blah
x.y={1 2 3 def} blah
blah

x.y={aaabc} blah
blah
x.y={123def} blah
blah

在最终放弃并发布问题之前,我在网上进行了搜索,但我没有找到任何有用的信息,因为我没有看到任何人遇到与我类似的问题。感谢您的帮助,因为我希望更好地理解正则表达式/sed 中的变量,谢谢!

最佳答案

使用您展示的示例,请尝试在 awk 中执行以下操作。用 GNU awk 编写和测试。

awk '
match($0,/\{[^}]*}/){
val=substr($0,RSTART,RLENGTH)
gsub(/[^{}a-zA-Z]/,"",val)
$0=substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH)
}
1
' Input_file

说明: 为以上添加详细说明。

awk '                                      ##Starting awk program from here.
match($0,/\{[^}]*}/){ ##using match function of awk to match from { to first occurrence of }
val=substr($0,RSTART,RLENGTH) ##Creating val which has sub string of matched regex in it.
gsub(/[^{}a-zA-Z]/,"",val) ##Globally substituting everything apart from { } and alphabets in val.
$0=substr($0,1,RSTART-1) val substr($0,RSTART+RLENGTH) ##saving everything before match val and everything after match here.
}
1 ##Printing line if it doesn't meet `match` condition mentioned above.
' Input_file ##Mentioning Input_file name here.


通用解决方案: 如果 { 和 } 多次出现,请尝试遵循 awk 代码。

awk '
{
line=""
while(match($0,/\{[^}]*}/)){
val=substr($0,RSTART,RLENGTH)
gsub(/[^{}a-zA-Z]/,"",val)
line=(line?line:"") (substr($0,1,RSTART-1) val)
$0=substr($0,RSTART+RLENGTH)
}
if(RSTART+RLENGTH!=length($0)){
$0=line $0
}
else{
$0=line
}
}
1
' Input_file

关于regex - 使用 sed 仅获取捕获组中的字母数字字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70981317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com