sed只删除包含但不包含行的行

时间:2015-04-08 04:35:44

标签: bash shell awk sed

我有一个包含许多行的文件,出于简化的目的,看起来很像这样。

aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb

每当我尝试提出一个仅过滤掉“xxx”行的sed命令时,所有其他行都会以某种方式过滤掉。也许我正在使用sed错误,或者还有另一个命令来执行此操作。

这个想法是一个sed命令,只删除xxx行,但不包含xxx行。

我可以编写一个命令来删除cli中的xxx行,但是我需要在一个从用户那里获取输入变量的脚本中按需重复执行。

这是我最新的“不工作”版本:

read var
sed -i -e '/^$var$/d'

3 个答案:

答案 0 :(得分:3)

在我看来,awk是比sed或grep更好的解决方案,因为它可以将模式视为字符串,而不是正则表达式。

awk -v x="$var" '$0!=x' file

答案 1 :(得分:2)

sed '/^xxx$/d' File

sed -i.bak '/^xxx$/d' File   => this edits the file in place, keeping a backup.

仅删除包含xxx ^ => beginning of line$ => end of line

的行

<强>示例:

AMD$ cat File
aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb

AMD$ sed '/^xxx$/d' File
aaaxxx
xxxbbb
aaaxxxbbb
bbbxxxaaa
aaa
bbb

修改 如果使用变量,请使用:

read var
sed -i "/^$var$/d" File

答案 2 :(得分:2)

如果您尝试从文件中删除与给定字符串完全匹配的所有行,则可以使用grep:

 grep -vFx "$match" "$file"

grep选项:

-v  Invert the match. Print lines which don't match.
-F  The match is an exact string, not a regular expression
-x  The match must match an entire line (except for the newline)

示例:

$ cat file
aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb
$ match=xxx
$ grep -vFx "$match" file
aaaxxx
xxxbbb
aaaxxxbbb
bbbxxxaaa
aaa
bbb