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

Hed*_*edy 2 regex awk sed

输入:

x.y={aaa b .c}
Run Code Online (Sandbox Code Playgroud)

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

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

所以它会来:

x.y={aaabbc}
Run Code Online (Sandbox Code Playgroud)

试用0

x.y={aaa b .c}
Run Code Online (Sandbox Code Playgroud)

这很棒,但我只想修改{}. 所以我认为这可能需要捕获组,因此我继续尝试这些:

试验1

x.y={aaabbc}
Run Code Online (Sandbox Code Playgroud)

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

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

试验2

$ echo 'x.y={aaa b .c}' | sed 's/[^[:alnum:]]\+//g'
xyaaabc
Run Code Online (Sandbox Code Playgroud)

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

s/x.y=\{([[:alnum:]]+)\}/x.y={\1}/
      ^^^^^^^^^^^^^^^^^^   
Run Code Online (Sandbox Code Playgroud)

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


输入/输出示例:

x.y={aaa b .c} blah
blah
x.y={1 2 3 def} blah
blah
Run Code Online (Sandbox Code Playgroud)

x.y={aaabc} blah
blah
x.y={123def} blah
blah
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*h13 5

使用您显示的示例,请尝试按照 中的操作进行操作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
Run Code Online (Sandbox Code Playgroud)

说明:对上述内容添加详细说明。

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. 
Run Code Online (Sandbox Code Playgroud)

通用解决方案:如果多次出现 { 和 },请尝试以下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
Run Code Online (Sandbox Code Playgroud)