I have a regex for session ID extraction:
[root@docker tmp]# grep -oE "\[[0-9].+\]" logfile
[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]
[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]
[root@docker tmp]#
How can I hide the square brackets from the output?
5 Answers 5
Instead of using extended-regex grep (-E
), use perl-regex grep instead (-P
), with a lookbehind and lookahead.
$ grep -oP "(?<=\[)[0-9].+(?=\])" logfile
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
Here, (?<=\[)
indicates that there should be a preceding \[
, and (?=\])
indicates that there should be a following \]
, but not to include them in the match output.
$ cat a.txt
test hello..[113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]... this is
te [113a6d9e-7b06-42c6-a52b-7a4e4d2e216c]. this is hello
$ grep -oP '(?<=\[)[^\]]*' a.txt
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
sed is more applicable for the case than grep
sed '/\n/{P;D;};s/\[/\n/;s/\]/\n/;D' log
-
1Hey, could you please explain what sed doing here. Thank you.Raja G– Raja G2018年09月22日 02:09:32 +00:00Commented Sep 22, 2018 at 2:09
One way is piping to cut
:
grep -oE "\[[0-9].+\]" logfile | cut -d'[' -f2 | cut -d']' -f1
The simplest way would be to let tr
delete them:
$ grep -oE "\[[0-9].+\]" logfile | tr -d '[]'
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
113a6d9e-7b06-42c6-a52b-7a4e4d2e216c
Notice that the tr
utility doesn't know about regular expressions or patterns in quite the same way as the shell does. In this case, the []
operand is just the two characters [
and ]
.
-
Yes , i tried that as well and same answer already posted as comment by @CostasRaja G– Raja G2017年02月28日 09:45:58 +00:00Commented Feb 28, 2017 at 9:45
| tr -d ']['
e.g.