Daniel wrote:
I am trying to remove the second occurance of the match. All the documentation I read says this is how you do it. For me it either is global or does not work. Is there a different way of doing this? Would awk be better?This some relavent lines from my hosts.deny file: === snipit === ALL:125.206.122.49 ALL:211.94.73.199 ALL:213.215.228.250 ALL:213.215.228.250 ALL:211.94.73.199 ALL:211.94.73.199 ALL:71.213.9.247 === snipit === sed -e 's/ALL:211\.94\.73\.199//' /etc/hosts.deny
This isn't working, because you are using the wrong sed command.Think about what you want to happen (delete lines). You are using s which is for search/replace. You should be using d for deleting lines. But since you want to just delete all lines after the first, you need to get a bit more complicated with sed. h (copy) and g (paste). FYI: using /1 or /2 indicates the occurrence of the pattern in the line, not the occurrence of the line in the file.
sed '/211\.94\.73\./{ h d } $G' /etc/hosts.deny
Here the sed script specifies a pattern (the IP address), and uses braces to signify multiple commands per line that matches this pattern.
h tells sed to copy the line into the clipboard. d deletes the line.$ means only apply this command to the very last line. G means paste the clipboard *after* the current line. (g would mean paste the
clipboard instead)http://www.grymoire.com/Unix/Sed.html is a pretty good tutorial on more advanced sed.
As you can see, sed is very powerful, and does a whole lot more than just search/replace. However, it isn't the best tool for everything. Your case is an example where sed will work, but it is definitely *not* the best approach. As others have mentioned, since you really want to just remove duplicates, using sort|uniq, or even sort -u is a much better approach.
--lonnie
smime.p7s
Description: S/MIME Cryptographic Signature
/* PLUG: http://plug.org, #utah on irc.freenode.net Unsubscribe: http://plug.org/mailman/options/plug Don't fear the penguin. */
