从字符串中删除]是否用作索引

时间:2012-11-28 16:00:42

标签: bash sed

尝试使用sed(在bash脚本中)进行子字符串编辑

string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]

目的是在没有像第二个那样用作索引类型时删除。 输出应为

string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]

4 个答案:

答案 0 :(得分:0)

这对我有用:

s/\[\([^]]\+\)\]/@B@\1@E@/g
s/\]//g
s/@B@/[/g
s/@E@/]/g

它首先用[...]替换所有@B@...@E@,但是。唯一剩下的]是非平衡的。然后,它只是删除它们并替换@ -strings。

注意:您的输入不应包含@ -strings。

答案 1 :(得分:0)

如果同时接受了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]

希望有所帮助

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/([^][]*(\[[^]]*\][^][]*)*)\]/\1/g' file

答案 3 :(得分:0)

sed 's/\([^\[0-9]\)\([0-9\]*\)\]/\1\2/'

这将删除任何],其前面不是[或0-9后跟零或更多0-9个字符。