sed replace last line matching pattern

后端 未结 14 2100
暗喜
暗喜 2020-12-11 01:45

Given a file like this:

a
b
a
b

I\'d like to be able to use sed to replace just the last line that contains an instance of \"a

14条回答
  •  情歌与酒
    2020-12-11 02:07

    Not quite sed only:

    tac file | sed '/a/ {s//c/; :loop; n; b loop}' | tac
    

    testing

    % printf "%s\n" a b a b a b | tac | sed '/a/ {s//c/; :loop; n; b loop}' | tac
    a
    b
    a
    b
    c
    b
    

    Reverse the file, then for the first match, make the substitution and then unconditionally slurp up the rest of the file. Then re-reverse the file.

    Note, an empty regex (here as s//c/) means re-use the previous regex (/a/)

    I'm not a huge sed fan, beyond very simple programs. I would use awk:

    tac file | awk '/a/ && !seen {sub(/a/, "c"); seen=1} 1' | tac
    

提交回复
热议问题