Is there any undocumented flag in AIX's sed implementation that allows for in-place editing in the same way as with e.g. GNU sed? The manual shows no flag for this operation, which is one of the most useful ones in other sed implementations.
5 Answers
you can use perl to do it:
perl -p -i.bak -e 's/old/new/g' test.txt It's going to create a .bak file.
Or without a .bak file :
perl -pi -e 's/old/new/g' test.txt Or install sed-4.1.1 RPM from here.
This is not possible on AIX even with the sed tool installed.
You do need to use a temp file like suggested by terdon in comments to the question:
sed 's/a/b/' foo > bar && mv bar foo You could also use ed which does inline editing.
- Why would it not be possible with GNU
sedinstalled?Stéphane Chazelas– Stéphane Chazelas2014-01-30 14:42:02 +00:00Commented Jan 30, 2014 at 14:42 - well the GNU provided by AIX not the one you can compile see also ==> stackoverflow.com/questions/7232797/…Kiwy– Kiwy2014-01-30 14:43:41 +00:00Commented Jan 30, 2014 at 14:43
- 2
-iwas added insed-3.95(2002). IBM offers 3.0.2, 4.0.7 and 4.1.1 AFAICT. Unless you get the older one, you'll get -i. Also note that you can get packaged version of GNUsedfor AIX from other sources.Stéphane Chazelas– Stéphane Chazelas2014-01-30 15:08:15 +00:00Commented Jan 30, 2014 at 15:08 - Well it means my admin system never updated since 2002 I guess. because even with AIX 6.1 I don't have the possibility to use that switchKiwy– Kiwy2014-01-30 15:17:47 +00:00Commented Jan 30, 2014 at 15:17
- 1@StéphaneChazelas I was reading between the lines of your comment from 2 years ago: "-i was added in sed-3.95 (2002). IBM offers 3.0.2, 4.0.7 and 4.1.1 AFAICT" the implication that you saw recent versions of AIX offering sed's that supported -i.2016-04-20 15:25:51 +00:00Commented Apr 20, 2016 at 15:25
To use a standard compliant sed, which does not have -i, to do in-place editing, in such a way that permissions, file ownerships and some other metadata are not modified and hard links and symlinks are not broken:
cp file file.tmp && sed 'expression' file.tmp >file && rm -f file.tmp This creates a temporary copy of the file we want to edit, and then applies the sed command to this copy while redirecting the result to the original filename.
Redirecting to the original filename will truncate and rewrite that file, and since the file is not first deleted and recreated, it will retain most of its metadata.
- 1fwiw, that's not what
sedis doing.sedis redirecting the output to a temp file, copy through the permissions and finally rename the temp file to the original. That will change the file's inode and wipe some precious metadata but a) will not trash the file's content if thesed -icommand was interrupted or failed b) will not trash the file's content if more that onesed -iwas run on the same file at the same time. More details and ranting here.user313992– user3139922019-03-12 14:15:53 +00:00Commented Mar 12, 2019 at 14:15 - 1@mosvy All true. The way I have arranged the commands in my answer will ensure that the original contents (at least) is still available in the temporary file if the
sedfails.2019-03-12 14:40:00 +00:00Commented Mar 12, 2019 at 14:40
Define a variable and use a subshell to execute
sedand redirect to a file. Very important use"(double quote) to protect the variable$value:value=$(sed 's/old/new/g' file) && echo "$value" > file
Or
Execute
echowith a subshell you going to execute 'sed' and redirect to a file:echo "$(sed 's/old/new/g' file)" > file
- That is just a convoluted way of doing what the comment by @terdon does. Better yet, grab the GNU sed and install that.vonbrand– vonbrand2016-03-01 14:53:47 +00:00Commented Mar 1, 2016 at 14:53
- option #2 will most likely truncate 'file' before reading from it -- be careful!2016-03-01 14:55:58 +00:00Commented Mar 1, 2016 at 14:55
- @JeffSchaller : no, because the subshell should end before print opens its fd.Mat M– Mat M2018-07-19 12:53:57 +00:00Commented Jul 19, 2018 at 12:53
- Use
printwith ksh or you will lose the line feeds.Mat M– Mat M2018-07-19 12:54:36 +00:00Commented Jul 19, 2018 at 12:54 - @vonbrand : it avoids creating a temp file, and it is sometimes a requirementMat M– Mat M2018-07-19 12:55:31 +00:00Commented Jul 19, 2018 at 12:55
Or use a here doc with ed -s. Sample short script - this hand copied, so may have a typo but the code is correct.
#!/bin/ksh echo "test heredoc by adding def to a line with abc" ed -s ./foo <<\END 1,$p /abc/s/$/def/p w q . END echo DONE Test file foo:
This is the test file qwerty asdfg AWEfgEDH abc this line needs def at the end!!! asfpgt My sample output:
97 abc this line needs def at the end!!!def 100 DONE
sed 's/a/b/' foo > bar && mv bar fooperl -piinstead.sed -i(at least on my Debian). It works by creating a temp file in the backgroud and renaming it to the original file's name so it will be owned by whoever ran thesed.