3 ms·
I'm much more familiar with sed than ed, so here's how I would to this: sed '/baz/{s/.*/&\n&/;s/baz/elephant/2}' input.txt or, slightly more readable sed
by bewuethr 8y ago
I'm much more familiar with sed than ed, so here's how I would to this:
sed '/baz/{s/.*/&\n&/;s/baz/elephant/2}' input.txt
or, slightly more readable
sed '/baz/ {
s/.*/&\n&/
s/baz/elephant/2
}' input.txt
The first substitution appends a copy of the line to the pattern space, the second substitution replaces the second occurrence of "baz" with "elephant".
This being said, I went ahead and bought the book mentioned in the article [0] - a neat little read.
[0]: https://www.michaelwlucas.com/tools/ed https://www.michaelwlucas.com/tools/ed
- textmode 8y agoTo use this solution with a version of sed that does not accept newlines in patterns (i.e. to make it portable), one has to put the commands in a sed commands file and run it with sed -f. How to make the one-liner portable without using a sed commands file? Maybe something like: sed 's/baz/elephant/;/^ \{2\}- elephant/{h;G;};/^ \{4\}- elephant/{h;G;};s/elephant/baz/' foo|sed -a wfoo 1. s/baz/elephant/ 2. duplicate that line if two or four space indent 3. s/elephant/baz/ 4. save N.B. no temp file used to save changes cf. jvns.ca blog: 1. search for baz 2. copy that line and paste it 3. s/baz/elephant/ 4. save and quit N.B. temp file in $TMPDIR used to save changes