部分文字列の編集を行うためにsed(bashスクリプト内)を試す
string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]
目的は、2 番目のようにインデックス タイプとして使用されない場合に ]s を削除することです。出力は
string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]
これは私のために働きます:
s/\[\([^]]\+\)\]/@B@\1@E@/g
s/\]//g
s/@B@/[/g
s/@E@/]/g
[...]
最初にすべてをに置き換えます。@B@...@E@
残り]
のは、バランスの取れていないものだけです。次に、それらを削除して、@文字列を置き換えます。
注意:入力に@文字列を含めないでください。
sed 's/\([^\[0-9]\)\([0-9\]*\)\]/\1\2/'
これにより、[または0-9以外の何かが前にあり、その後に0個以上の0-9文字が続く]が削除されます。
これはあなたのために働くかもしれません(GNU sed):
sed -r 's/([^][]*(\[[^]]*\][^][]*)*)\]/\1/g' file
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
例はそれをよりよく説明しています:(私はあなたの入力にさらに2行を追加しました)
#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]
それが役に立てば幸い