仅选择最后一个匹配模式

use*_*482 5 linux sed

我想sed只是文本文件的最后一个匹配模式.

输入文件:

boy
boy
girl
boy
Run Code Online (Sandbox Code Playgroud)

输出文件:

boy
boy
girl
boys
Run Code Online (Sandbox Code Playgroud)

cho*_*ban 8

一种方法是反转文件,仅替换第一个匹配,然后再将其反转.

tac <file> | sed '1 s/boy/boys/' | tac | sponge <newfile>
Run Code Online (Sandbox Code Playgroud)

tac将"连接并反向打印文件".海绵将"吸收标准输入并写入文件".这是在debian的"moreutils"包中.

  • 与`tac> newfile`相比,"海绵"管道有什么好处?如果数据很大,缺点是存在一个额外的管道,数据必须被复制进出,这会减慢速度. (2认同)

Bet*_*eta 5

您所需要的只是$:

sed '$s/boy/boys/'
Run Code Online (Sandbox Code Playgroud)

  • 假设在最后一个'男孩'之后还有另一个'女孩'?这适用于特定的示例数据,但不是更一般. (9认同)