我们如何按照特定模式从文件中的行中删除字符串?

how can we remove string from rows in a file following a particular pattern?

我有一个包含许多同名行的纯文本文件:

./intuit
./intuit/apac-trial13
./safenetdatasecurityisraelltd3
./safenetdatasecurityisraelltd3/ldk-emea-eval

我想从所有行中删除 ./ 还有

./intuit
./safenetdatasecurityisraelltd3

我可以从所有行和没有子目录的行中删除 ./ 的任何 unix 命令

$ sed -n 's@^\./@@; /\// p' test.txt
intuit/apac-trial13
safenetdatasecurityisraelltd3/ldk-emea-eval

我们在那里做了什么? sed -n 表示 "don't print unless I say so." 然后,s@^\./@@ 删除前导 ./(如果存在)。最后,我们用 / 匹配任何行(适当转义),并用 p.

打印它

在 UNIX 中,您始终可以组合使用多个命令来完成任务。

正如您提到的,首先您要从每一行中删除前导 ./。因此,使用 sed 将前导 ./ 替换为空:

$ sed 's:^\./::' input.txt 
intuit
intuit/apac-trial13
safenetdatasecurityisraelltd3
safenetdatasecurityisraelltd3/ldk-emea-eval

然后,除此之外,您还需要列出其中包含子目录的行。现在,要确定行是否有子目录,一种方法是查看它是否有 /.

$ sed 's:^\./::' input.txt | grep '/'
intuit/apac-trial13
safenetdatasecurityisraelltd3/ldk-emea-eval

在 UNIX 中,您可以使用 | 将一个命令的输出作为输入传递给其他命令。