How do I output only a capture group with sed
Using sed
:
sed -nE 's/^(pytest[^=]*=[^[:blank:]]*).*/\1/p' file
pytest==6.2.5
pytest-sugar==0.9.4
pytest-django==4.4.0
However a grep -o
solution would be even simpler:
grep -o '^pytest[^=]*=[^[:blank:]]*' file
pytest==6.2.5
pytest-sugar==0.9.4
pytest-django==4.4.0
Explanation:
-
^pytest
: Matchpytest
at the start -
[^=]*
: Match 0 or more of any character except=
-
=
: Match a=
-
[^[:blank:]]*
: Match 0 or more of non-whitespace characters
You are missing the regex after #
. This should solve it:
$ sed -nE "s/(^pytest.+)#.*/\1/p" ./requirements/local.txt
1st solution: With awk
you could try following. Using match
function of awk
here, written and tested in GNU awk
should work in any any. Simple explanation would be, using match
function of awk
to match regex ^pytest[^ ]*
to match starting value of pytest till 1st occurrence of space and print the matched value by using substr
function of awk
.
awk 'match($0,/^pytest[^ ]*/){print substr($0,RSTART,RLENGTH)}' Input_file
2nd solution: Using GNU awk
try following where making use of RS
variable of it.
awk -v RS='(^|\n)pytest[^ ]*' 'RT{sub(/^\n*/,"",RT);print RT}' Input_file
As an alternative using awk
, you might also set the field separator to #
preceded by optional spaces, and print the first column if it starts with pytest
awk -F"[[:blank:]]*#" '/^pytest/ {print $1}' ./requirements/local.txt
Output
pytest==6.2.5
pytest-sugar==0.9.4
pytest-django==4.4.0
If the #
is not always present, you could also make the match more specific to match the number, and then print the first field:
awk '/^pytest[^[:blank:]]*==[0-9]+(\.[0-9]+)*/ {print $1}' file