Unix iMac shell terminal
sed -i 's/original/new/g' maths.tx
Message returned: sed: -i may not be used with stdin
Unix iMac shell terminal
sed -i 's/original/new/g' maths.tx
Message returned: sed: -i may not be used with stdin
Macs use the BSD version of utilities such as sed
and date
, which have their own idiosyncrasies.
In this specific case, the BSD build of sed
mandates the extension for the backup file with -i
, rather than it being optional, as in GNU sed
.
As such:
sed -i .bak 's/needle/pin/g' haystack
The shown command will replace all instances of needle
with pin
in the file haystack
, and the original file will be preserved in haystack.bak
.
From the manual for the implementation of sed
on a Mac:
-i extension Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
As opposed to on a Linux host:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
Note that "a zero-length extension" is distinct from "no extension". You can eschew the backup entirely, then, with:
sed -i '' 's/needle/pin/g' haystack
sed -i.bak ...
(no space, and a dot). This leads to create a backup file. If you don't want it, as you know the filename anyway, it's easy to add a && rm filename.ext.bak
after the sed
. This way works on both sed versions.
– zezollo
Aug 16 '22 at 16:50
sed -i .bak
is also portable, for the record. The space is optional. As, for that matter, is the .
; it's just that if you do sed -i bak
for a file file
, the backup would then be called filebak
which some might not find as readable.
– DopeGhoti
Aug 16 '22 at 20:04
You have to specify a backup file, like:
sed -i .bak 's/original/new/g' maths.tx
sed -i 's/original/new/g' < maths.txt
(note the addition of the less-than sign) – Jeff Schaller Nov 01 '17 at 22:13