How can I use a file in a command and redirect output to the same file without truncating it?

前端 未结 14 2969
终归单人心
终归单人心 2020-11-21 22:11

Basically I want to take as input text from a file, remove a line from that file, and send the output back to the same file. Something along these lines if that makes it any

14条回答
  •  半阙折子戏
    2020-11-21 22:40

    You can't use redirection operator (> or >>) to the same file, because it has a higher precedence and it will create/truncate the file before the command is even invoked. To avoid that, you should use appropriate tools such as tee, sponge, sed -i or any other tool which can write results to the file (e.g. sort file -o file).

    Basically redirecting input to the same original file doesn't make sense and you should use appropriate in-place editors for that, for example Ex editor (part of Vim):

    ex '+g/seg[0-9]\{1,\}\.[0-9]\{1\}/d' -scwq file_name
    

    where:

    • '+cmd'/-c - run any Ex/Vim command
    • g/pattern/d - remove lines matching a pattern using global (help :g)
    • -s - silent mode (man ex)
    • -c wq - execute :write and :quit commands

    You may use sed to achieve the same (as already shown in other answers), however in-place (-i) is non-standard FreeBSD extension (may work differently between Unix/Linux) and basically it's a stream editor, not a file editor. See: Does Ex mode have any practical use?

提交回复
热议问题