sed:删除以$ p开头的所有内容,但不仅仅是$ p

时间:2015-09-11 06:27:11

标签: regex sed

我试图找到一个sed命令,它将删除以另一个单词开头的wrod的每个实例,但不删除单词本身。所以,如果我有

aardvark
aardvarky
aardvarkiest

我想删除aardvarky和aardvarkiest,但不是aardvark。

我试过

sed -n  "/^$p.*/ d"

希望做某种正则表达式,这意味着从$ p开始,然后是一些字符*,但它似乎没有用。

2 个答案:

答案 0 :(得分:1)

这将删除以$p开头且至少还有一个字符的所有行:

$ sed "/^$p./d" file
aardvark

要更改文件,请使用-i选项。使用GNU sed:

sed -i "/^$p./d" file

使用BSD(OSX)sed:

sed -i "" "/^$p./d" file

讨论

考虑:

sed -n  "/^$p.*/ d"

此命令不会打印任何内容:-n表示除非明确要求,否则不打印任何内容,并且没有明确打印的命令(p)。

此外,*表示前一个字符为零或移动。因此,$p.*也匹配$p

我们可以使用:

$ sed "/^$p.\+/d" file
aardvark

\+表示前面一个或多个字符。但是,\+没有用,因为匹配^$p.\+的任何行也匹配更简单的^$p.(反之亦然)。

警告

在sed命令中使用shell变量具有潜在的危险性。例如,以下内容将文件写入当前目录:

p=$'a/w hi.there\n/'; sed "/^$p.\+/d" file

除非shell变量是由受信任的代码创建的,否则不应在sed命令中使用shell变量。

答案 1 :(得分:0)

使用grep如下所示保留除aardvark之外的所有行

grep -v -w 'aardvark' file

如果你想删除除aardvark之外的所有东西:

grep -w aardvark file