尝试使用 sed(在 bash 脚本中)进行一些子字符串编辑
string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]
目的是在不用作索引类型(如第二个)时删除 ]s。输出应该是
string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]
sed 's/\([^\[0-9]\)\([0-9\]*\)\]/\1\2/'
这将删除任何前面有不在 [ 或 0-9 中的内容后跟零个或多个 0-9 字符的 ]。
如果 awk 也被接受,请检查下面的 awk 解决方案:
awk 'BEGIN{OFS=FS=""}{ for(i=1;i<=NF;i++){
s+=$i=="["?1:0;
e+=$i=="]"?1:0;
if(e>s){$i="";e--} }
s=e=0; print $0; }' file
笔记
"]"
,这意味着foo[a[b[c]
不会被修改foo[x]bar]blah
会变成foo[x]barblah
一个例子更好地解释了它:(我在你的输入中添加了两行)
#in my new lines(1,2) all "]"s surrounded with * should be removed
kent$ cat a.txt
stringx=randomthi[foo]bar*]*xx*]*
stringy=random[f]x*]*bar[b]*]*blah
string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]
kent$ awk 'BEGIN{OFS=FS=""}{ for(i=1;i<=NF;i++){
s+=$i=="["?1:0;
e+=$i=="]"?1:0;
if(e>s){$i="";e--} }
s=e=0; print $0; }' a.txt
stringx=randomthi[foo]bar**xx**
stringy=random[f]x**bar[b]**blah
string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]
希望能帮助到你
这可能对您有用(GNU sed):
sed -r 's/([^][]*(\[[^]]*\][^][]*)*)\]/\1/g' file
这对我有用:
s/\[\([^]]\+\)\]/@B@\1@E@/g
s/\]//g
s/@B@/[/g
s/@E@/]/g
它首先将 all 替换[...]
为@B@...@E@
,剩下的唯一]
是不平衡的。然后,它只是删除它们并将@-strings 替换回来。
请注意:您的输入不应包含@-strings。