Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is it possible to do it in one liner?

I have an output like this:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

This input is generated automatically.

I want to replace the first occurrence of " (quotation mark + space) with " (quotation mark) for each line. If I apply the substitution globally, it will also change every occurrence of line" - to line"-, so I was wondering if it is possible to use a sed one liner to accomplish this.

I have tried using ^ like this

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

But it's not working, it doesn't replace anything. I tried

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

and it replaces all the occurrences. I've just started to use sed, so I don't really know if I'm doing something wrong.

What am I missing here?

share|improve this question
    
A note about labels: The command you wrote above may work in some implementations of sed, but for portability and to avoid really weird errors, you should end a given command argument after a label (if you need them at all). E.g., sed -e ':a' -e 'N;$!ba' -e 'whatever' – Wildcard Apr 11 at 20:47
up vote 13 down vote accepted

You're overthinking it. sed replaces only the first instance on a line by default (without the /g modifier), although you still want to anchor because you don;t so much want the first instance in the line as the one at the start of the line; and you usually don't need the explicit line actions you're trying to use (why?).

sed 's/^" /"/'
share|improve this answer
    
Thanks! I thought it was necessary to explicitly declare the line actions when working on a file, read about it and just kept on using them. I really was over-thinking it, that couldn't be simpler and it does the trick :) – Steve B. Apr 9 '12 at 3:33
    
I'm tempted to say those commands are pretty much obsolete; it is possible to do quite complex multiline things with them, but it's not easy to do so and these days you're really better off using perl/python/ruby/whatever instead. – geekosaur Apr 9 '12 at 3:40
    
Completely disagree with the above comment; multi-line sed commands such as N and labels such as :a are not obsolete at all and they are portable and POSIX specified, unlike Perl/Python/Ruby/whatever. It is true however that if you find yourself needing them often, you should learn awk. – Wildcard Apr 11 at 19:16

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.