2

部分文字列の編集を行うためにsed(bashスクリプト内)を試す

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

目的は、2 番目のようにインデックス タイプとして使用されない場合に ]s を削除することです。出力は

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

4 に答える 4

0

これは私のために働きます:

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

[...]最初にすべてをに置き換えます。@B@...@E@残り]のは、バランスの取れていないものだけです。次に、それらを削除して、@文字列を置き換えます。

注意:入力に@文字列を含めないでください。

于 2012-11-28T16:19:52.167 に答える
0
sed 's/\([^\[0-9]\)\([0-9\]*\)\]/\1\2/'

これにより、[または0-9以外の何かが前にあり、その後に0個以上の0-9文字が続く]が削除されます。

于 2012-11-29T14:21:21.547 に答える
0

これはあなたのために働くかもしれません(GNU sed):

sed -r 's/([^][]*(\[[^]]*\][^][]*)*)\]/\1/g' file
于 2012-11-28T22:41:42.037 に答える
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

例はそれをよりよく説明しています:(私はあなたの入力にさらに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]

それが役に立てば幸い

于 2012-11-28T20:59:36.347 に答える