2016-07-31 166 views
0

我有一個文本文件。如何使用sed刪除帶方括號的行?

cat 3.txt 
qqq abc cdef (1234) [5689a] 
abcfde [aaaa] 
ffff [321] 

此文件括號內容。

IFS=$'\n' 
VAR=($(</tmp/3.txt)) 
LEN=${#VAR[@]} 

for ((i = 0; i <LEN; i++));do 
    echo ${VAR[$i]} 
    sed -i -e "\#${VAR[$i]}#d" /tmp/3.txt 
done 

欲回聲

QQQ ABC CDEF(1234)[5689a]

然後刪除該行。 並回顯第二行。然後刪除第二行。 和回聲第三行。然後刪除第三行。 但是這行[]。如何使用sed刪除這一行?

+2

如果您可以告訴我們您爲什麼要這樣做,它會幫助我們找到答案,無論您需要以正確的方式做任何事情。具體來說 - 你爲什麼要打印,然後刪除一行,同時打印所有匹配的行,然後一起刪除它們?此外,拿出一個更好地說明你的問題的例子,因爲現在'cat 3.txt; > 3.txt'會產生你想要的輸出。我懷疑這個問題是[XY問題]的一個例子(http://xyproblem.info/)。 –

+0

如果可以的話,可以使用'readarray -t VAR chepner

+0

'readarray -t VAR將顯示如下: 'qqq''abc''cdef''(1234)''[5689a]''abcfde'' [aaaa]''ffff'' [0121]' –

回答

3

恕我直言,你不能只用一個sed做,但下面可能是一個辦法

$ cat 38680195 
qqq abc cdef (1234) [5689a] 
qqq abc cdef (134) [4hgh] 
line with <angle brackets> 
line without brackets 
line with {curly braces} 
line with [square brackets] 
another line without brackets 
$ sed -n '/\[[^]]*\]/p' 38680195 && sed -i.backup '/\[[^]]*\]/d' 38680195 
qqq abc cdef (1234) [5689a] 
qqq abc cdef (134) [4hgh] 
line with [square brackets] 
$ cat 38680195 
line with <angle brackets> 
line without brackets 
line with {curly braces} 
another line without brackets 

注意
原始文件的備份被放置在38680195.backup

$ cat 38680195.backup 
qqq abc cdef (1234) [5689a] 
qqq abc cdef (134) [4hgh] 
line with <angle brackets> 
line without brackets 
line with {curly braces} 
line with [square brackets] 
another line without brackets 

編輯

更智能的方法可能是

grep '\[[^]]*\]' 38680195 && sed -i.backup '/\[[^]]*\]/d' 38680195 

在這種情況下,如果沒有一行包含[],所述SED部分不會被執行,因爲它在邏輯上是AND ED(參見&&)。

+0

我想回顯一行並刪除一行,所以我需要使用數組,讀取一行然後回顯它。如果我使用'sed -n'/ \ [[^]] * \]/p'38680195 && sed -i.backup'/ \ [[^]] * \]/d'38680195'它會改變每個[]在文件中。在下一輪迴聲將不會打印正確的值。 –

+0

'回顯一行並刪除一行'?從哪裏刪除一行? – sjsam

+0

回顯第一行然後從3.txt刪除第一行,然後回顯第二行從3.txt刪除第二行。 –

0

這是另一種方法:

grep '\[' test.txt; sed "s/^.*\[\+.*$//" test.txt | grep -v '^$'; 

第一grep的發現與括號線,所述第二去除那些線和最後的grep僅顯示其不是空行(其是那些沒有括號)。