Hacker News new | past | comments | ask | show | jobs | submit login

Worth it just for learning that there's a "replace" command, for multi-file search-and-replace without having to remember sed syntax.

Can't believe I've been running Linux for 16 years and I didn't know about that one.




I was tempted to poke a little fun at you for having trouble with sed -- among my peers, 's/foo/bar/g' used pretty much daily, even just in informal emails/conversations.

But I'm glad I looked at the list first, because I found this wonder: `lstopo --of txt`. I'm going to use this in class next week, I can't believe I've never seen that before.


My biggest hardship with sed is having to figure out how to escape the operators within regular expressions on the command line. I think it's pretty reasonable to spend 15+ minutes on a complicated replacement regex.

Edit: It looks like I agree with you; `replace` only solves trivial problems that can easily be done with `sed`.


Also sed can use other characters instead of / for separating fields, like using _ instead for / heavy stuff:

  sed -e 's_https://www\.example\.com/_/_g'
I think it's nicer than:

  sed -e 's/https:\/\/www\.example\.com\//\//g'


You can use single quotes to escape everything except single quotes from the shell. Then use backslashes to escape single quotes where needed.

If you haven't taken the time, I'd say it's well worth learning exactly how the shell escapes work. It's surprisingly simple and natural once you get used to it.


Thanks for the advice; I should block some time to fully grok shell escapes.

Even with single quotes, sed still requires escaping parentheses, + operators, and other operators that would otherwise be interpreted literally (but not all operators should be escaped). In the languages that I learned regexes this wasn't required.


There's a command line switch -E for sed that gives you what we think of as "normal" regex escaping.


You have saved me many hours of future command line hacking. Thanks!


Oh, the basic syntax is fine. I'm a Vim user ;) And even before that, s///g was also part of my slang.

My issue is remembering how to invoke the command - whether it edits in place by default, what the order of arguments is, etc. To be fair, that's not necessarily that much easier with a dedicated replace command either.


On my system (Ubuntu 16.04) replace is not installed by default.

It appears to be provided by the following packages:

    mysql-server-5.7
    mariadb-server-10.0
    percona-server-server-5.6
    percona-xtradb-cluster-server-5.6
I downloaded mysql to check, and it appears that the replace provided is as described in the article; I assume the others are as well.


I'm not sure how I feel about installing something as big as mysql-server just to get one utility.

Unfortunately it seems to pull in some MySQL/MariaDB specific code - https://github.com/MariaDB/server/blob/bb2c1a52c61706dde8c52...


It's also worth noting that in MySQL, the replace command is deprecated in 5.7.18 and removed in MySQL 8. [0]

I don't know its status in MariaDB.

[0] https://dev.mysql.com/doc/refman/5.7/en/replace-utility.html


Not covered in the article, but `rename` is a multi-file renamer. I wrote a script which used an `echo $f | sed | mv` loop before I learned about this.


Be careful there's at least two implementations of rename in different Linux distros. I've run into one made in perl that uses regex in Debian (e.g. `rename 's/foo/bar/' * `). And another one that uses simple strings (`rename foo bar * `) in CentOS.


Indeed. The Perl `rename` is based on the module [File::Rename](http://search.cpan.org/~rmbarker/File-Rename-0.20/).

This name clash makes that the perl module cannot be easily used on CentOS, since the CentOS utility is required for building RPM packages.

You'd have to edit Makefile.PL of the Perl module before installation, to avoid that clash. (I'd prefer to keep the name as "rename.pl", in this case; though file-rename, as on Windows, would work too.)


I use moreutils' vidir for renaming, I don't know rename though.


I was super confused at your comment. Search on Arch Linux packages, it looks like the replace command is shipped with mysql/mariadb.

?!


rpl is pretty nice as well.




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: