Não sou especialista em bash e tenho problemas para filtrar a substring correta.
Eu tenho
echo "AT^SYSCFGEX=\\\"0201\\\",3fffffff,2,4,7fffffffffffffff,,"
que resulta como
AT^SYSCFGEX=\"0201\",3fffffff,2,4,7fffffffffffffff,,
Como posso obter 0201
o resultado? Estou lutando com isso.
Com
sed
extrai o primeiro número da string.
execução de exemplo
Explicações
-r
– usar expressões regulares estendidass/a/b/
- substituira
porb
[^0-9]*
– pegue tudo, exceto um dígito, aqui correspondeAT^SYSCFGEX=\"
([0-9]+)
– pegue pelo menos um dígito e salve em um grupo, aqui corresponde0201
.*
– pegue todo o resto da linha, aqui combina\",3fffffff,2,4,7fffffffffffffff,,
\1
- obtenha o conteúdo do primeiro grupo salvo antesAqui está uma alternativa usando
grep
no modo PCRE (-P
) com lookarounds regex, mostrando apenas as partes correspondentes de cada linha (-o
):Isso corresponde a todos os números que estão entre aspas duplas com barra invertida, como
\"0201\"
, mas sem retornar as aspas no resultado.(?<=\\")
é um lookbehind, que corresponde a uma string vazia se for precedida pelo padrão interno (\"
).\d+
corresponde a um ou mais dígitos.(?=\\")
é um lookahead, que corresponde a uma string vazia se for seguida pelo padrão interno (\"
).Exemplo:
Com
bash
a Expansão de ParâmetrosSe você quiser usar apenas,
bash
você pode fazer assim:Explicações
${var#*\"}
– expande para o conteúdo da variávelvar
com a correspondência de padrão*"
(ou seja, tudo até"
) removido desde o início${var%%\\\"*}
– expande para o conteúdo da variávelvar
com a correspondência de padrão\"*
(ou seja, tudo de\"
) removido do final.Leitura adicional
man bash
/EXPANSÃO/Expansão de ParâmetrosAqui está uma
awk
abordagem. A ideia aqui é queawk
(ou para ser preciso, GNUawk
) pode usar vários caracteres como separadores. Assim, podemos usar\
e"
como separadores, para extrair a string desejada com:Observe os múltiplos
\
, que são necessários para escapar da barra invertida e evitar que ela seja interpretada pelo shell como escape para o próximo caractere.Com o
echo
comando na pergunta,Alternativamente, poderíamos apenas usar
"
como separador e cortar a última função\
viasubstr()
: