输入:
x.y={aaa b .c}
Run Code Online (Sandbox Code Playgroud)
请注意,其中的内容{}
只是一个示例,实际上它可以是任何值。
问题:我想只保留中的{}
字母数字字符。
所以它会来:
x.y={aaabbc}
Run Code Online (Sandbox Code Playgroud)
x.y={aaa b .c}
Run Code Online (Sandbox Code Playgroud)
这很棒,但我只想修改{}
. 所以我认为这可能需要捕获组,因此我继续尝试这些:
x.y={aaabbc}
Run Code Online (Sandbox Code Playgroud)
在这里,我已经捕获了我想要aaa b .c
正确修改 () 的内容,但我需要一种方法以某种方式s/[^[:alnum:]]\+//g
仅在\1
.
相反,我尝试仅捕获所有字母数字字符(到\1
),如下所示:
$ 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 中的变量,谢谢!
使用您显示的示例,请尝试按照 中的操作进行操作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)
归档时间: |
|
查看次数: |
655 次 |
最近记录: |