與sed的嘗試(在bash腳本)做一些子串編輯刪除]它用作索引
string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]
目的是除去] S時它不是用作索引就像第二個那樣。 輸出應該
string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]
與sed的嘗試(在bash腳本)做一些子串編輯刪除]它用作索引
string1=randomthing0]
string2=otherthing[15]}]
string3=reallyotherthing[5]]
目的是除去] S時它不是用作索引就像第二個那樣。 輸出應該
string1=randomthing0
string2=otherthing[15]}
string3=reallyotherthing[5]
這個工作對我來說:
s/\[\([^]]\+\)\]/@[email protected]\[email protected]@/g
s/\]//g
s/@[email protected]/[/g
s/@[email protected]/]/g
它首先替換所有[...]
與@[email protected]@[email protected]
,資訊技術唯一剩下的]
就是非平衡的。然後,它將刪除它們並將@ -strings替換回來。
小心:您的輸入不應包含@ -string。
如果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]
希望它有助於
這可能爲你工作(GNU SED):
sed -r 's/([^][]*(\[[^]]*\][^][]*)*)\]/\1/g' file
sed 's/\([^\[0-9]\)\([0-9\]*\)\]/\1\2/'
這會刪除任何],其前面有一些不在[或0-9後跟零個或多個0-9個字符的東西。
你可以處理的方式是將命令封裝在'sed's/@/@ A/g'| ...腳本... | sed's/@ A/@/g''所以在腳本中你可以使用@B,@C等來表示任何你喜歡的東西,你知道那些不能出現在你的腳本得到的輸入中,因爲每個@由於第一個sed,您的原始輸入由A成功。 –
非常感謝:) – newbee
由於第一個sed命令匹配的是[array [7]而不是[7],所以請注意上面的腳本可能不像你想要的[數組[7] '。如果這是一個問題,請將'[^]]'改爲'[^] []'。 –