sed 仅删除包含的行,但不删除包含的行

sed remove only lines that are, but not lines containing

为了简化起见,我有一个包含很多行的文件,看起来很像这样。

aaaxxx
xxxbbb
xxx
aaaxxxbbb
bbbxxxaaa
aaa
bbb

每次我尝试想出一个 sed 命令只过滤掉带有 "xxx" 的行时,所有其他行都会以某种方式被过滤掉。也许我用错了 sed,或者还有另一个命令可以做到这一点。

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

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

这是我最新的 'not working' 版本:

read var
sed -i -e '/^$var$/d'
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

如果您试图从文件中删除与给定字符串完全匹配的所有行,您可以使用 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

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

awk -v x="$var" '[=10=]!=x' file