如何使用 sed 匹配模式并在 diff 文件中输出

如何使用 sed 匹配模式并在 diff 文件中输出

我有一个纯文本文件,看起来像

*,cli-verify-aggregation-general,./link-aggr/aggregation.xls
-,stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls

我需要另一个文件,其中仅包含以“-”开头的行

输出文件:

stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls

它不应该有“-”

答案1

有几种可能的方法可以实现您想要的目标。假设您的输入文件被调用input.txt并且您的输出 - 想象一下 - output.txt,以下内容应该有效:

1. 使用awk和的方法cut

awk '/^-/' input.txt | cut -d "," -f 2-  > output.txt

这指示awk匹配input.txt以 a 开头的每一行-,并将匹配行(这是默认操作,因此不需要显式指定)打印到标准输出。

这通过管道作为输入到cut,它以每个逗号 ( ) 分隔行-d ","并打印如此标识的所有字段,但从第二( ),从而省略您想要删除的-f 2-前导。-

然后输出被重定向到一个文件。

您可以在以下位置找到更多信息GNU Awk 用户指南如果你感兴趣。

2. 使用grep和的方法cut

在这个相当“简单”的设置中,您也可以使用grepawk 来代替,具有类似的效果:

grep "^-" input.txt | cut -d "," -f 2- > output.txt

要使用的正则表达式是相同的:匹配 a -,但前提是它出现为该行的第一个字符(这就是前面的含义^)。

3. 使用方法sed

最后,你还可以使用sed来实现这一点

sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt

这指示使用两个规则sed进行处理。input.txt

  • 首先,从输入中删除所有文件不是以 a-开头:第一个^仍然意味着以下内容必须作为该行的第一个字符出现,但在表达式中[ ... ]它意味着“除了a -"。如果找到这样的行,它将被删除(不用担心,sed除非您指定该选项,否则不会触及您的输入文件-i)。
  • 其次,在所有输入行中,将 ( s/.../.../)前导替换-,为 ... 空(因此将其删除)。

输出再次重定向到文件。

正如@Sundeep 所指出的,这也可以通过声明变成一个更紧凑的单一规则

sed -n 's/^-,//p' input.txt > output.txt

它指示sed删除所有像这样开始的行中的前导-,,并打印(仅)匹配的行(尾随p),再次将输出重定向到文件。笔记该选项-n在这里很重要,可以抑制所谓的输出模式空间这会干扰你想要实现的目标。

相关内容