我试图找到一个sed命令,它将删除以另一个单词开头的wrod的每个实例,但不删除单词本身。所以,如果我有
aardvark
aardvarky
aardvarkiest
我想删除aardvarky和aardvarkiest,但不是aardvark。
我试过
sed -n "/^$p.*/ d"
希望做某种正则表达式,这意味着从$ p开始,然后是一些字符*,但它似乎没有用。
答案 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