2012-11-28 93 views
2

與sed的嘗試(在bash腳本)做一些子串編輯刪除]它用作索引

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

目的是除去] S時它不是用作索引就像第二個那樣。 輸出應該

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

回答

0

這個工作對我來說:

s/\[\([^]]\+\)\]/@[email protected]\[email protected]@/g 
s/\]//g 
s/@[email protected]/[/g 
s/@[email protected]/]/g 

它首先替換所有[...]@[email protected]@[email protected],資訊技術唯一剩下的]就是非平衡的。然後,它將刪除它們並將@ -strings替換回來。

小心:您的輸入不應包含@ -string。

+1

你可以處理的方式是將命令封裝在'sed's/@/@ A/g'| ...腳本... | sed's/@ A/@/g''所以在腳本中你可以使用@B,@C等來表示任何你喜歡的東西,你知道那些不能出現在你的腳本得到的輸入中,因爲每個@由於第一個sed,您的原始輸入由A成功。 –

+0

非常感謝:) – newbee

+0

由於第一個sed命令匹配的是[array [7]而不是[7],所以請注意上面的腳本可能不像你想要的[數組[7] '。如果這是一個問題,請將'[^]]'改爲'[^] []'。 –

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] 

希望它有助於

0

這可能爲你工作(GNU SED):

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

這會刪除任何],其前面有一些不在[或0-9後跟零個或多個0-9個字符的東西。