如何使用sed删除带方括号的行?

时间:2016-07-31 02:20:02

标签: bash sed brackets

我有一个文本文件。

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 个答案:

答案 0 :(得分: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编辑(请参阅&&)。

答案 1 :(得分:1)

这是另一种方法:

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

第一个grep找到带括号的行,第二个grep删除那些行,最后的grep只显示非空的行(没有括号的行)。