O título basicamente diz tudo, mas não consigo entender nada e fico confuso com a correspondência de expressões regulares do bash. Esta é a if
declaração que tenho no meu script bash, mas continua correspondendo à linha ${new_user}
em vez de # ${new_user}
. Basicamente, quero corresponder a um usuário "comentado".
if [[ $(<"foo.txt") =~ \#.*${new_user} ]]; then
Para este padrão é muito mais simples não usar uma regex e apenas usar uma expressão glob. Isso é equivalente à
^#.*${new_user}
sua pergunta:Como você ancora apenas um lado da sua pergunta, parece que você deseja combinar caracteres arbitrários depois de
$new_user
. Se você realmente deseja ancorar no final, remova o arquivo*
.Embora seja certamente possível usar expressões regulares no bash, a ergonomia e as armas de pé presentes são bastante estranhas. Sempre que possível, recomendo usar globs ou outros mecanismos.
Se você realmente precisa usar regexes, veja como você faria isso (a única diferença é citar
${new_user}
caso tenha caracteres regex):Novamente, se você quiser ancorar no final, adicione um arquivo
$
.Também é possível que você tenha entendido mal o que
^
significa em um contexto multilinha. No bash,^
corresponde ao início de uma string, não ao início de uma linha. Se você precisar examinar cada linha para determinar se algo está presente ou não, useif grep ...; then
ou o seguinte loop:Se você não se importa com arquivos sem nova linha final, pode omitir a
[[ $line ]]
verificação.