Eu quero remover todos os caracteres até a primeira letra [a-zA-Z]
em uma string. Por exemplo:
#121Abc
-->Abc
%Ab#c
-->Ab#c
Ab#c
-->Ab#c
Abc
-->Abc
1Abc
-->Abc
1 21Abc
-->Abc
1^1 Abc
-->Abc
Nota: Todas as não letras incluem caracteres não imprimíveis.
É possível com ferramentas bash?
com
awk
:com
sed
:Nota: se você tiver linhas que não contenham caracteres alfabéticos, elas terminarão com linhas vazias na saída, para pular a impressão dessas linhas e pular as linhas vazias na entrada, você precisa usar:
ou o mesmo fazendo com
grep
(graças a @glennjackman )Com operadores de expansão de parâmetro POSIX sh (inicialmente de ksh), supondo que a entrada esteja em uma variável de shell:
Observe que o que
[A-Za-z]
corresponde não é especificado, exceto na localidade C. Na prática, é bastante aleatório, especialmente com obash
shell .[[:alpha:]]
corresponde a todos os caracteres considerados como letras (ou, mais geralmente, caracteres que normalmente fazem parte da transcrição de palavras da linguagem humana, mesmo em scripts não alfabéticos) na localidade. Para corresponder apenas em letras ASCII em inglês, independentemente da localidade, você usaria[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]
.Usando apenas Bash:
(e assim por diante, definindo
a
a string que você deseja processar).Usando Raku (anteriormente conhecido como Perl_6):
OU (mais simplesmente):
Entrada de amostra:
Saída de amostra:
Incluindo esta resposta caso o OP tenha texto Unicode que precise de tratamento. Resumidamente, os sinalizadores lineares de impressão automática do Raku
-pe
são usados para implementar o idioma conhecido (sed
-like)s///
.Quanto aos conjuntos de caracteres, o Raku fornece conjuntos de caracteres baseados em propriedades Unicode . A classe de caractere de letra Unicode é denotada usando
<:Letter>
, e sua negação é denotada pela adição de um ponto de!
exclamação como:<:!Letter>
. Existem duas subclasses de letras Unicode que também são úteis,<:Lu>
letras maiúsculas e<:Ll>
letras minúsculas.Se você tiver linhas em branco que precisam ser removidas, poderá alternar para os
-ne
sinalizadores lineares sem impressão automática, assim:Existem algumas outras opções de regex... O Raku também fornece classes de caracteres predefinidas , como a
<alpha>
classe, que inclui "caracteres alfabéticos mais sublinhado (_)" . É bastante fácil lembrar que em Raku,<alnum>
é igual a<alpha>
mais<digits>
. Nota para conjuntos de caracteres nesta categoria, a negação é indicada com um-
sinal de menos à esquerda:Acima trata o arquivo de amostra corretamente (incluindo Unicode), exceto para a terceira linha da última onde
_!_Abc
permanece inalterada e a última linha onde_Åbc
permanece inalterada. Para remover esses_
sublinhados principais, o código de alternância abaixo funciona (embora usar a<:Letter>
classe Unicode no topo seja mais simples, pois essa classe não contém_
sublinhado):Por fim, se o OP acreditar que os caracteres Unicode não serão encontrados, os caracteres simples
range
abaixo funcionarão (novamente, com um-
sinal de menos à esquerda para indicar negação):Observe, no entanto, que o código imediatamente acima - embora simples de entender - não manipulará as duas últimas linhas do arquivo Sample Input corretamente, retornando
bc
em vez do (presumivelmente) desejadoÅbc
.https://docs.raku.org/language/regexes
https://raku.org
sem ferramentas, mas apenas com
bash
recursos:tr
parad
eletar oc
complemento do charset você diz:perl
transliteração: