2

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

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

目的是在不用作索引类型(如第二个)时删除 ]s。输出应该是

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

4 回答 4

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

这将删除任何前面有不在 [ 或 0-9 中的内容后跟零个或多个 0-9 字符的 ]。

于 2012-11-29T14:21:21.547 回答
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

笔记

  • 上面的脚本不够通用。它只删除 unbalanced "]",这意味着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]

希望能帮助到你

于 2012-11-28T20:59:36.347 回答
0

这可能对您有用(GNU sed):

sed -r 's/([^][]*(\[[^]]*\][^][]*)*)\]/\1/g' file
于 2012-11-28T22:41:42.037 回答
0

这对我有用:

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

它首先将 all 替换[...]@B@...@E@,剩下的唯一]是不平衡的。然后,它只是删除它们并将@-strings 替换回来。

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

于 2012-11-28T16:19:52.167 回答