I'm having trouble figuring how to delete a string in between parentheses only when it is in parentheses. For example, I want to delete the string "(Laughter)", but only when it's in parenthesis and not just make it a case sensitive deletion since a sentence within that string starts with Laughter.
            Asked
            
        
        
            Active
            
        
            Viewed 1.7k times
        
    5
            
            
        - 
                    2Have you tried anything? – anubhava Jan 07 '15 at 18:22
- 
                    I've tried everything I can think of. I just tried MightyPork's answer and that didn't work. The only thing that I haven't tried that I can think of is searching for all strings in parens with grep then deleting them with sed or something. I don't know I'm at a complete loss. – Teddy T Jan 07 '15 at 19:27
- 
                    your question is very unclear, but my commands work. – MightyPork Jan 07 '15 at 19:28
- 
                    Specifically: there is a sentence that reads "word word (Laughter) words word words. Laughter words word." how do I delete the "(Laughter)" and not the other "Laughter" not in parentheses that begins the second sentence? Because I just get "word word Laughter words word words. Laughter words word." from it. – Teddy T Jan 07 '15 at 19:32
- 
                    1That works perfectly fine: http://jpeg.cz/images/2015/01/08/480J3.png – MightyPork Jan 08 '15 at 16:47
- 
                    Indeed @MightyPork answer does work. You must be leaving something out in your question, or you're not implementing it correctly. – buydadip Jan 08 '15 at 17:03
- 
                    @TeddyT it might also help to provide an excerpt of the file you wish to change. – buydadip Jan 08 '15 at 17:10
2 Answers
8
            
            
        I'm not sure I understand you correctly, but the following will remove text between parentheses:
sed "s/[(][^)]*[)]/()/g" myfile
(or as Llama pointed out in comments, just:)
sed "s/([^)]*)/()/g" myfile
It matches a literal open paren [(] followed by any number of non-) characters [^)]* followed by a literal close paren [)].
Example:
$ echo "Blah blah (potato) moo (cow is a pretty bird)(hello)" | sed "s/[(][^)]*[)]/()/g"
Blah blah () moo ()()
Use // instead of /()/ there if you don't want the empty parens in the output.
 
    
    
        MightyPork
        
- 18,270
- 10
- 79
- 133
- 
                    In sed, you don't *need* the parens in character classes (although it's probably not a bad habit to play it safe). The following works fine: `sed "s/([^)]*)/()/g"` – Mr. Llama Jan 07 '15 at 18:28
- 
                    That's because by default (GNU) sed uses "basic" regular expressions, where grouping is done with `\(` and `\)`, not `(` and `)`. see https://www.gnu.org/software/gnulib/manual/html_node/Regular-expression-syntaxes.html – glenn jackman Jan 07 '15 at 18:36
- 
                    1
- 
                    Works too, yeah. Not much of a difference of you just wanna check if it works, no? – MightyPork Jan 07 '15 at 18:41
- 
                    1I think @TomFenech is referring to [`The Useless Use of Cat`](http://www.smallo.ruhr.de/award.html#cat). There are some edge cases where using `cat` may lead to unexpected results. Here's a [SO question](http://stackoverflow.com/q/11710552/477563) on the topic. – Mr. Llama Jan 07 '15 at 18:46
3
            
            
        Here's an awk solution because, why not?
awk '{gsub("[(][^)]*[)]","")}1' file
OR
awk -F '[(][^)]*[)]' '{for(i=1; i<=NF; i+=1)printf("%s",$i);printf("\n")}' file
Remember that in order to escape parentheses use must enclose them in [] brackets.
By using [^)]*, as @MightyPork did in his answer, which indicates any number of characters that are not parentheses, will reduce the greed of the match. In contrast, using .* instead, would result in a greedy match. 
 
    
    
        buydadip
        
- 8,890
- 22
- 79
- 154
