我有一个文件,如下所示:
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