使用sed删除TXT中提到的最后一次特定字符串之后的所有行



我有一个文件,如下所示:

Apple prices
$15.74 p 12
$13.17 p 12
$8.19 p 8
Apple prices
$12.99 p 11
$4.67 p 1
$3.22 p 2
Apple prices
$3.99 p 1
$4.65 p 2
$2.19 p 1

我想要一个单行sed命令,删除上次提到"苹果价格"后的所有内容。所以结果是:

Apple prices
$15.74 p 12
$13.17 p 12
$8.19 p 8
Apple prices
$12.99 p 11
$4.67 p 1
$3.22 p 2

在sed中,我尝试使用'/Apple prices/q2',但这会在第一次提到它之后删除所有内容,而不是最后一次。

有没有一种方法可以让它只在最后一次使用sed后删除所有内容?

问题是sed不知道"Apple prices"的出现是最后一次,直到它到达另一个——还是文件的末尾。但它可以在等待空间收集线路并推迟决策:

sed -n '/Apple prices/{x;/./p;d;};H'

编辑:受@potong评论启发的另类选择:

sed '/Apple prices/!{H;d;};x;1d;'

在这种情况下,一种常见的策略是逐行反转输入,根据第一次出现的情况做出决定,然后再次反转输出

$ # with awk: tac ip.txt | awk 'f; /Apple prices/{f=1}' | tac
$ tac ip.txt | sed '0,/Apple prices/d' | tac
Apple prices
$15.74 p 12
$13.17 p 12
$8.19 p 8
Apple prices
$12.99 p 11
$4.67 p 1
$3.22 p 2

相关内容

  • 没有找到相关文章

最新更新