use ‘sed’ to give the shell perl-like powers
January 29th, 2007 by Lawrence David
i’ve just discovered sed. this thing is wonderful; it’s like an in-line perl on the command-line. now, it looks like i can use the shell to do things that even a perl program would be overkill for.
for instance, i’ve got these files:
[ldavid@subtilis data]$ ls
ECprot119.phy  ECprot1519.phy ECprot19.phy   ECprot2519.phy
ECprot1219.phy ECprot1619.phy ECprot2019.phy ECprot3119.phy
ECprot1319.phy ECprot1819.phy ECprot219.phy  ECprot519.phy
i want to strip the alphabetical characters from each filename (so that i can number my directories later). i could use perl, or i could …
[ldavid@subtilis data]$ ls * | sed ‘s/ECprot\([0-9]*\)\.phy/\1/’
119
1219
1319
1519
1619
1819
19
2019
219
2519
3119
519
note that there are some small things to note about this sed command if you’re coming from a perl background. first, you need to escape out the parentheses for matching. second, sed doesn’t seem to know about “\d”; you instead have to just write “[0-9].” third, sed also doesn’t know about “+”; you’ll have to just settle for “*” to do multi-character matches. fourth, you can’t print the match using “$1″ like in perl; instead, you write “\1″.
Why not just use `perl -pe` instead of `sed`? Then you really have all the power of perl.
ls | perl -pe ‘s/ECprot(\d+)\.phy/$1/’
I realize that it takes 4 more characters to type, but that’s what aliases are for:
alias psed=’perl -pe’
In fact with your example you end up saving characters because of \d etc.
i think i’m allergic to perl. still, that’s an entirely valid point ivan and it certainly makes more complex things like populating hashes from the CL easy to do …
Ah, I thought you wanted perl, but didn’t want to write a perl script. Personally, I’m allergic to sed and awk. All of the bad of perl and little of the good.