The input is #PermitRootLogin no. Why doesn't the following sed expression work with sed?
echo "#PermitRootLogin no" | sed 's/^#PermitRootLogin\s .*/PermitRootLogin yes/'
but after I remove the after the keyword it works?
echo "#PermitRootLogin no" | sed 's/^#PermitRootLogin\s.*/PermitRootLogin yes/'
I thought the after a \s would mean one or more of the previous token.
PS: Works either way with regex101.com
CodePudding user response:
You have to escape the
sign:
In GNU sed, with basic regular expression syntax these characters ?
,
, parentheses, braces ({})
, and |
do not have special meaning unless prefixed with a backslash \
.
The plus sign
in your case means match a literal
, so it would match the plus in #PermitRootLogin no
. You have to escape it in \s\
to be able to match one or more whitespace character #PermitRootLogin no
echo "#PermitRootLogin no" | sed 's/^#PermitRootLogin\s\ .*/PermitRootLogin yes/'
Output:
PermitRootLogin yes