Problem with occurence of square brackets


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Problem with occurence of square brackets
# 8  
Old 06-12-2014
I decided to use neutronscott's solution, which I understand except the effect of these two expressions:

Code:
sed 's/[^[]*[[]\([^]]*\)]\([[][^]]*]\)*\([^]]*\)$/\1 -- \3/g' infile
            ^^^            ^^^

A group which consists of a single square bracket? I would have written the single square bracket without the enclosure but this does not work obviously.

Last edited by zaxxon; 06-12-2014 at 05:53 AM.. Reason: typo
# 9  
Old 06-12-2014
Quote:
Originally Posted by zaxxon
I decided to use neutronscott's solution, which I understand except the effect of these two expressions:

Code:
sed 's/[^[]*[[]\([^]]*\)]\([[][^]]*]\)*\([^]]*\)$/\1 -- \3/g' infile
            ^^^            ^^^

A group which consists of a single square bracket? I would have written the single square bracket without the enclosure but this does not work obviously.
If you understood the meaning of a repetition of a non-matching bracket expression (such as [^[]* which matches zero or more occurrences of any character except [), I'm surprised that you didn't understand the meaning of the matching bracket expression [[] which matches one occurrence of the [ character. Similarly, [^]] matches any character other than ] and []] matches a ].

You have to use the bracket expression [[] or escape the opening bracket \[ to distinguish it as a character to be matched (rather than the start of a bracket expression). In some contexts, you do not need to use a bracket expression or an escape to specify a closing bracket, but the meaning is is the same if you use []] and it is symmetric with the [[] if you have an editor that pairs up opening and closing parentheses, braces, and brackets.
These 2 Users Gave Thanks to Don Cragun For This Post:
# 10  
Old 06-12-2014
Quote:
You have to use the bracket expression [[] or escape the opening bracket \[
Ok, I would have written it escaped. So far I never used the grouping to avoid escaping - I was not aware this is an "allowed" usage of the square brackets.
It's now clear to me, thanks.

Last edited by zaxxon; 06-12-2014 at 08:48 AM.. Reason: typo
# 11  
Old 06-12-2014
Both suggestions could be reduced a bit, when taking into account sed's greedy matchin property, notably \[.*\] matches everything between the first square bracket until the last, from the point of where sed's is looking at that moment. Thus:

CarloM's approach, with the two dashes inserted:
Code:
sed 's/[^[]*\[\([^]]*\)\]/\1 --/; s/\[.*\]//' file

And NeutronScott's approach..
Code:
sed 's/[^[]*[[]\([^]]*\)]\(\[.*\]\)*/\1 --/' file

(the original will fail with more than two square bracket episodes)
These 3 Users Gave Thanks to Scrutinizer For This Post:
# 12  
Old 06-12-2014
Yes, sorry. It's just clever escaping. Like one would ps | grep [s]omething. I began to use this more because in awk, depending on quoting/context, often times you need to escape your escapes since they're really processed twice, and it gets ugly so I tend to avoid \ when possible now. Smilie

Quote:
Originally Posted by Scrutinizer
And NeutronScott's approach..
Code:
sed 's/[^[]*[[]\([^]]*\)]\(\[.*\]\)*/\1 --/' file

(the original will fail with more than two square bracket episodes)
The * after the grouping allows it to repeat. But I see mine doesn't perform correctly in the last two cases.

Code:
mute@thedoctor:~$ cat input
this is spam [i need this][this is spam][another one][last] and i need this too
this is spam [i need this] probably everything [here] too
this is spam [i need this] and probably i need ] everything here too?
mute@thedoctor:~$ sed 's/[^[]*[[]\([^]]*\)]\([[][^]]*]\)*\([^]]*\)$/\1 -- \3/g' input
i need this --  and i need this too
this is spam [here --  too
this is spam [i need this] and probably i need ] everything here too?
mute@thedoctor:~$ sed 's/[^[]*[[]\([^]]*\)]\(\[.*\]\)*/\1 --/' input
i need this -- and i need this too
i need this -- probably everything [here] too
i need this -- and probably i need ] everything here too?

I also didn't think of not needing to match & sub the last part. That's definitely shorter.
# 13  
Old 06-12-2014
Quote:
Originally Posted by Scrutinizer
Both suggestions could be reduced a bit, when taking into account sed's greedy matchin property, notably \[.*\] matches everything between the first square bracket until the last, from the point of where sed's is looking at that moment. Thus:

CarloM's approach, with the two dashes inserted:
Code:
sed 's/[^[]*\[\([^]]*\)\]/\1 --/; s/\[.*\]//' file

Note that that isn't just slightly shorter, it also corrects the output to match Zaxxon's requirement - my original produced different output since it left any non-leading text not inside brackets.
# 14  
Old 06-12-2014
Yet another approach:
Code:
sed 's/]\(.*]\)*/ --/; s/.*\[//' file


Last edited by Scrutinizer; 06-12-2014 at 02:55 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

IF statement with square brackets

Hi All, Hope you all are doing good. Yesterday in my project i came across a scenario which i can not guess why it was working in one region and why it was not in another region. Please find my issue below. I am using AIX version 6.0 of UNIX in my project, in shell scripting i have the... (1 Reply)
Discussion started by: mad man
1 Replies

2. Shell Programming and Scripting

Grep number between Square [] brackets

I wanted to store the number inside the square bracket between colon( : ) and closing suqre bracket(]) in some variable. Suppose I have lines like : Input file : 20140320 00:08:23.846 INFO 84] - anything in line 20140320 00:08:23.846 Test 589] - Virtual and lab lab anything... (18 Replies)
Discussion started by: nes
18 Replies

3. Shell Programming and Scripting

Compare the value in between square brackets in file

I wanted to compare the value inside the Squre bracket after Colon ( : ) based on any value(seperated by or operator | ) inside the variable Thread and if match found then wnated to store in output file Input file : 20140320 00:08:43.918 INO 35] - Corporate hub is 20140320 00:08:43.918... (2 Replies)
Discussion started by: nes
2 Replies

4. Shell Programming and Scripting

Extract text between two square [..] brackets

Hi All, After searching about this, I could find some solutions but I am not sure why it is not working in my case. I have a text file with contents between two square brackets. The text file looks like this: Use tags when you post any code so others can easily read your code. You can... (2 Replies)
Discussion started by: shoaibjameel123
2 Replies

5. Shell Programming and Scripting

Delete text between square brackets and also delete those square brackets using sed or awk

Hi All, I have a text file which looks like this: computer programming systems engineering I want to get rid of these square brackets and also the text that is inside these brackets. So that my final text file looks like this: computer programming systems engineering I am using... (3 Replies)
Discussion started by: shoaibjameel123
3 Replies

6. Shell Programming and Scripting

Replacing text between two square brackets

hi guys, i'm writing a script that looks for a unquie id in a file and replaces a string between two square brackets on the same line as the unquie id: ....... ....... 0001 zz 43242 replace this text] name 0002 sd 65466 UK] country ....... ....... how can i find line with id 0001... (6 Replies)
Discussion started by: zaff
6 Replies

7. UNIX for Dummies Questions & Answers

Test command - Two square brackets

Hello, Can someone please explain to me the following line, ] && break I do not understand why two test square brackets are used. Thanks, Shantanu ---------- Post updated at 03:38 PM ---------- Previous update was at 03:35 PM ---------- And, also why there's a $ before (echo $c |... (5 Replies)
Discussion started by: Shan_u2005
5 Replies

8. Shell Programming and Scripting

Double square brackets question

Hi, I just came across an interesting shell script syntax like the one below: ] && (trap 'rm -rf ${WORK_DIR}/*.$$; echo "\n\nInterrupted !!\n\n"; exit 4' 1 2 3 15) Can someone please explain the code snippet above? The trap command bit is fine but ] && is the hazy part. Generally we use an... (2 Replies)
Discussion started by: King Nothing
2 Replies

9. Shell Programming and Scripting

WHy the double square brackets?

One of the senior administrators gave me a shell script to modify and it begins as follows: if ] && ] {more code follows} Why the double square brackets? (10 Replies)
Discussion started by: mojoman
10 Replies

10. UNIX for Dummies Questions & Answers

square brackets

I would like to substitute a phrase which contains square brackets. change TO how? Thanks (2 Replies)
Discussion started by: gilead29
2 Replies
Login or Register to Ask a Question