我有一个文本文件。
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删除这一行?
答案 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只显示非空的行(没有括号的行)。