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 clearer.
grep -v 'seg[0-9]\{1,\}\.[0-9]\{1\}' file_name > file_name
however, when I do this I end up with a blank file. Any thoughts?
Since this question is the top result in search engines, here's a one-liner from https://serverfault.com/a/547331 that uses a subshell instead of
sponge
(which often isn't part of a vanilla install like OS X):Or the general case:
Test from https://askubuntu.com/a/752451:
Should print:
Whereas calling
cat file_uniquely_named.txt > file_uniquely_named.txt
in the current shell:Prints an empty string.
I haven't tested this on large files (probably over 2 or 4 GB).
I have borrowed this answer from Hart Simha and kos.
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 astee
,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):
where:
'+cmd'
/-c
- run any Ex/Vim commandg/pattern/d
- remove lines matching a pattern using global (help :g
)-s
- silent mode (man ex
)-c wq
- execute:write
and:quit
commandsYou 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?One liner alternative - set the content of the file as variable:
You can use slurp with POSIX Awk:
Example
maybe you can do it like this:
Try this