Extract substring according to regexp with sed or grep Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) 2019 Community Moderator Election Results Why I closed the “Why is Kali so hard” questionCan grep output only specified groupings that match?How to treat a file as a single line with grep to apply a regexp search pattern?Extracting a regex matched with 'sed' without printing the surrounding charactersgrep (/sed/awk) month rangeFunction to simplify grep with an often used logUsing sed instead of grep to output only matching part of lineErasing 2-lines pattern with sed/grep/whateverHow to split an output to two files with grep?How to make BSD grep respect start-of-line anchorbash script to replace script tags in html with their content
Significance of Cersei's obsession with elephants?
Take 2! Is this homebrew Lady of Pain warlock patron balanced?
Why does it sometimes sound good to play a grace note as a lead in to a note in a melody?
How were pictures turned from film to a big picture in a picture frame before digital scanning?
A term for a woman complaining about things/begging in a cute/childish way
Find 108 by using 3,4,6
Effects on objects due to a brief relocation of massive amounts of mass
What's the meaning of "fortified infraction restraint"?
Do any jurisdictions seriously consider reclassifying social media websites as publishers?
How could we fake a moon landing now?
Time to Settle Down!
Question about debouncing - delay of state change
As a beginner, should I get a Squier Strat with a SSS config or a HSS?
Why should I vote and accept answers?
Why do we bend a book to keep it straight?
Central Vacuuming: Is it worth it, and how does it compare to normal vacuuming?
What is the appropriate index architecture when forced to implement IsDeleted (soft deletes)?
If Windows 7 doesn't support WSL, then what does Linux subsystem option mean?
AppleTVs create a chatty alternate WiFi network
Trademark violation for app?
Most bit efficient text communication method?
What does it mean that physics no longer uses mechanical models to describe phenomena?
How to install press fit bottom bracket into new frame
Illegal assignment from sObject to Id
Extract substring according to regexp with sed or grep
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
2019 Community Moderator Election Results
Why I closed the “Why is Kali so hard” questionCan grep output only specified groupings that match?How to treat a file as a single line with grep to apply a regexp search pattern?Extracting a regex matched with 'sed' without printing the surrounding charactersgrep (/sed/awk) month rangeFunction to simplify grep with an often used logUsing sed instead of grep to output only matching part of lineErasing 2-lines pattern with sed/grep/whateverHow to split an output to two files with grep?How to make BSD grep respect start-of-line anchorbash script to replace script tags in html with their content
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
In a (BSD) UNIX environment, I would like to capture a specific substring using a regular expression.
Assume that the dmesg
command output would include the following line:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
I would like to capture the text between the <
and >
characters, like
dmesg | <sed command>
should output:
Marvell Console 1.01
However, it should not output anything if the regex does not match. Many solutions including sed -e 's/$regex/1/
will output the whole input if no match is found, which is not what i want.
The corresponding regexp could be:regex="^pass2: <(.*)>"
How would i properly do a regex match using sed
or grep
? Note that the grep -P
option is unavailable in my BSD UNIX distribution. The sed -E
option is available, however.
sed grep regular-expression
add a comment |
In a (BSD) UNIX environment, I would like to capture a specific substring using a regular expression.
Assume that the dmesg
command output would include the following line:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
I would like to capture the text between the <
and >
characters, like
dmesg | <sed command>
should output:
Marvell Console 1.01
However, it should not output anything if the regex does not match. Many solutions including sed -e 's/$regex/1/
will output the whole input if no match is found, which is not what i want.
The corresponding regexp could be:regex="^pass2: <(.*)>"
How would i properly do a regex match using sed
or grep
? Note that the grep -P
option is unavailable in my BSD UNIX distribution. The sed -E
option is available, however.
sed grep regular-expression
It's possibly better to parse the output ofcamcontrol devlist
than the output ofdmesg
.
– JdeBP
Mar 19 at 16:58
add a comment |
In a (BSD) UNIX environment, I would like to capture a specific substring using a regular expression.
Assume that the dmesg
command output would include the following line:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
I would like to capture the text between the <
and >
characters, like
dmesg | <sed command>
should output:
Marvell Console 1.01
However, it should not output anything if the regex does not match. Many solutions including sed -e 's/$regex/1/
will output the whole input if no match is found, which is not what i want.
The corresponding regexp could be:regex="^pass2: <(.*)>"
How would i properly do a regex match using sed
or grep
? Note that the grep -P
option is unavailable in my BSD UNIX distribution. The sed -E
option is available, however.
sed grep regular-expression
In a (BSD) UNIX environment, I would like to capture a specific substring using a regular expression.
Assume that the dmesg
command output would include the following line:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
I would like to capture the text between the <
and >
characters, like
dmesg | <sed command>
should output:
Marvell Console 1.01
However, it should not output anything if the regex does not match. Many solutions including sed -e 's/$regex/1/
will output the whole input if no match is found, which is not what i want.
The corresponding regexp could be:regex="^pass2: <(.*)>"
How would i properly do a regex match using sed
or grep
? Note that the grep -P
option is unavailable in my BSD UNIX distribution. The sed -E
option is available, however.
sed grep regular-expression
sed grep regular-expression
asked Mar 19 at 13:30
SteinerSteiner
908
908
It's possibly better to parse the output ofcamcontrol devlist
than the output ofdmesg
.
– JdeBP
Mar 19 at 16:58
add a comment |
It's possibly better to parse the output ofcamcontrol devlist
than the output ofdmesg
.
– JdeBP
Mar 19 at 16:58
It's possibly better to parse the output of
camcontrol devlist
than the output of dmesg
.– JdeBP
Mar 19 at 16:58
It's possibly better to parse the output of
camcontrol devlist
than the output of dmesg
.– JdeBP
Mar 19 at 16:58
add a comment |
3 Answers
3
active
oldest
votes
Try this,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Or POSIXly (-E
has not made it to the POSIX standard yet as of 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Output:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
This will only print the last occurrence of <...>
for each line.
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
1
Why not use<([^>]+)>
? I.e. not->
one-or-more times
– Rich
Mar 19 at 17:29
1
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.
– RoVo
Mar 20 at 7:02
add a comment |
How about -o
under grep to just print the matching part? We still need to remove the <>
, though, but tr
works there.
dmesg |egrep -o "<([a-zA-Z.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01
add a comment |
I tried below 3 methods by using sed, awk and python
sed command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"
output
Marvell Console 1.01
awk command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" 'print $2'
output
Marvell Console 1.01
python
#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
o=i.split(' ')
for i in o[1:4]:
h.append(i)
print (" ".join(h)).replace('>','').replace('<','')
output
Marvell Console 1.01
I was thinking theawk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.
– jwm
Mar 20 at 0:00
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f507188%2fextract-substring-according-to-regexp-with-sed-or-grep%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try this,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Or POSIXly (-E
has not made it to the POSIX standard yet as of 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Output:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
This will only print the last occurrence of <...>
for each line.
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
1
Why not use<([^>]+)>
? I.e. not->
one-or-more times
– Rich
Mar 19 at 17:29
1
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.
– RoVo
Mar 20 at 7:02
add a comment |
Try this,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Or POSIXly (-E
has not made it to the POSIX standard yet as of 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Output:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
This will only print the last occurrence of <...>
for each line.
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
1
Why not use<([^>]+)>
? I.e. not->
one-or-more times
– Rich
Mar 19 at 17:29
1
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.
– RoVo
Mar 20 at 7:02
add a comment |
Try this,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Or POSIXly (-E
has not made it to the POSIX standard yet as of 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Output:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
This will only print the last occurrence of <...>
for each line.
Try this,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Or POSIXly (-E
has not made it to the POSIX standard yet as of 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Output:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
This will only print the last occurrence of <...>
for each line.
edited Mar 19 at 14:34
Stéphane Chazelas
315k57597955
315k57597955
answered Mar 19 at 13:43
RoVoRoVo
3,960317
3,960317
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
1
Why not use<([^>]+)>
? I.e. not->
one-or-more times
– Rich
Mar 19 at 17:29
1
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.
– RoVo
Mar 20 at 7:02
add a comment |
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
1
Why not use<([^>]+)>
? I.e. not->
one-or-more times
– Rich
Mar 19 at 17:29
1
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.
– RoVo
Mar 20 at 7:02
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:
dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
This works for me, with both the -n parameter and the /p suffix inside the regex. Full command i used:
dmesg | sed -nE 's/^pass2: <(.*)>.*$/1/p
– Steiner
Mar 19 at 13:51
1
1
Why not use
<([^>]+)>
? I.e. not->
one-or-more times– Rich
Mar 19 at 17:29
Why not use
<([^>]+)>
? I.e. not->
one-or-more times– Rich
Mar 19 at 17:29
1
1
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.– RoVo
Mar 20 at 7:02
sed
regex is per default non-greedy, so it's not necessary here. But it would work, too.– RoVo
Mar 20 at 7:02
add a comment |
How about -o
under grep to just print the matching part? We still need to remove the <>
, though, but tr
works there.
dmesg |egrep -o "<([a-zA-Z.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01
add a comment |
How about -o
under grep to just print the matching part? We still need to remove the <>
, though, but tr
works there.
dmesg |egrep -o "<([a-zA-Z.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01
add a comment |
How about -o
under grep to just print the matching part? We still need to remove the <>
, though, but tr
works there.
dmesg |egrep -o "<([a-zA-Z.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01
How about -o
under grep to just print the matching part? We still need to remove the <>
, though, but tr
works there.
dmesg |egrep -o "<([a-zA-Z.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01
edited Mar 19 at 20:02
ilkkachu
63.5k10104181
63.5k10104181
answered Mar 19 at 13:44
Radek RadekRadek Radek
1014
1014
add a comment |
add a comment |
I tried below 3 methods by using sed, awk and python
sed command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"
output
Marvell Console 1.01
awk command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" 'print $2'
output
Marvell Console 1.01
python
#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
o=i.split(' ')
for i in o[1:4]:
h.append(i)
print (" ".join(h)).replace('>','').replace('<','')
output
Marvell Console 1.01
I was thinking theawk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.
– jwm
Mar 20 at 0:00
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
add a comment |
I tried below 3 methods by using sed, awk and python
sed command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"
output
Marvell Console 1.01
awk command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" 'print $2'
output
Marvell Console 1.01
python
#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
o=i.split(' ')
for i in o[1:4]:
h.append(i)
print (" ".join(h)).replace('>','').replace('<','')
output
Marvell Console 1.01
I was thinking theawk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.
– jwm
Mar 20 at 0:00
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
add a comment |
I tried below 3 methods by using sed, awk and python
sed command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"
output
Marvell Console 1.01
awk command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" 'print $2'
output
Marvell Console 1.01
python
#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
o=i.split(' ')
for i in o[1:4]:
h.append(i)
print (" ".join(h)).replace('>','').replace('<','')
output
Marvell Console 1.01
I tried below 3 methods by using sed, awk and python
sed command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"
output
Marvell Console 1.01
awk command
echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" 'print $2'
output
Marvell Console 1.01
python
#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
o=i.split(' ')
for i in o[1:4]:
h.append(i)
print (" ".join(h)).replace('>','').replace('<','')
output
Marvell Console 1.01
edited Mar 19 at 20:01
ilkkachu
63.5k10104181
63.5k10104181
answered Mar 19 at 16:55
Praveen Kumar BSPraveen Kumar BS
1,7731311
1,7731311
I was thinking theawk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.
– jwm
Mar 20 at 0:00
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
add a comment |
I was thinking theawk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.
– jwm
Mar 20 at 0:00
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
I was thinking the
awk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.– jwm
Mar 20 at 0:00
I was thinking the
awk
approach too. Should you constrain your print to lines beginning with "pass2:"? The OP didn't provide sufficient detail, but I can imagine that a naive pattern match would not be quite what was wanted.– jwm
Mar 20 at 0:00
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
Python can read from standard in, though perl specializes in this kind of text processing if you’re moving into higher level scripting languages.
– D. Ben Knoble
Mar 20 at 3:48
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f507188%2fextract-substring-according-to-regexp-with-sed-or-grep%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
It's possibly better to parse the output of
camcontrol devlist
than the output ofdmesg
.– JdeBP
Mar 19 at 16:58