Here is my code which always returns 'false' only:-
export STR="MYC-14:: This is sample string only."
echo $STR
test -z "$(echo "$STR" | sed '/^MYC-/p' )" && echo "true" || echo "false"
I'm trying to match the starting characters "MYC-" from the variable called "STR" but seems like the regular expression within sed condition is wrong due to which test command is returning false.
CodePudding user response:
test -z "$str" succeeds (returns 0) when $str is the empty string. Your sed command is outputting data, so the string is not empty and test is failing (returning non-zero). So the echo "false" branch is executed.
Note that test is not "returning false". It is returning non-zero (eg, it is failing). if does not test boolean conditions, and it is better if you stop thinking about true/false and instead think about success/failure. test failed, because the string it tested was not empty. Because sed generated some output.
If you want to test that a string is not the empty string, use test -n.
CodePudding user response:
By default, sed always outputs the line after processing. Therefore,
echo "$STR" | sed '/^MYC-/p'
will always output the line: once if it doesn't match, twice if it matches.
Use sed -n to tell sed not to print the line by default.
Most shells make it possible to test this without running an external tool. For example, in bash you can write
if [[ $STR = MYC-* ]] ; then
...
fi
CodePudding user response:
Finally, I'm able to make it work:-
export STR="MYC-14:: This is sample string only."
echo $STR
test -z "$(echo "$STR" | sed '/^MYC-/d' )" && echo "truee" || echo "falsee"
