尝试使用sed(在bash脚本中)进行子字符串编辑
string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]
目的是在没有像第二个那样用作索引类型时删除。 输出应为
string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]
答案 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个字符。