Eu preciso identificar a posição de um caractere na string usando o comando grep.
Exemplo, a sequência é RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
Como encontro a posição de |
na string especificada?
text-processing
grep
string
user82782
fonte
fonte
Respostas:
Você pode usar
-b
para obter o deslocamento de bytes, que é o mesmo da posição para texto simples (mas não para UTF-8 ou similar).No exemplo acima, eu uso o
-a
switch para dizer ao grep para usar a entrada como texto; necessário ao operar em arquivos binários, e a-o
opção para gerar apenas os caracteres correspondentes.Se você deseja apenas a posição, pode usar grep para extrair apenas a posição:
Se você obtiver uma saída estranha, verifique se o grep tem as cores ativadas. Você pode desativar as cores passando
--colors=never
para grep ou prefixando o comando grep com um\
(que desativará qualquer apelido), por exemplo:Para uma sequência que retorna várias correspondências, passe
head -n1
para obter a primeira correspondência.Observe que eu uso os dois itens acima e observe que este último não funcionará se o grep for "alias" através de um executável (script ou outro), apenas ao usar aliases.
fonte
2
;)^
:)0:|
como output-- porque 0 é a posição de byte do início da linha onde|
é encontrado.grep (GNU grep) 2.27
. Você talvez esteja usando o OS X?Experimentar:
resultado:
Isso fornecerá a posição com o índice baseado em 1.
fonte
printf '%s\n' '|' | grep -o . | grep -n '|'
imprime1
, não0
conforme o esperado.Se você estiver usando o shell bash , poderá usar operações puramente internas sem a necessidade de gerar processos externos, como grep ou awk :
Isso usa uma expansão de parâmetro para remover todas as ocorrências de
|
segue por qualquer sequência e salvar em uma variável temporária. É apenas uma questão de medir o comprimento da variável temporária para obter o índice de|
.Observe que
if
está verificando se|
existe alguma na string original. Caso contrário, a variável temporária será igual ao original.Observe também que isso fornece o índice baseado em zero, o
|
que geralmente é útil na indexação de strings do bash. No entanto, se você precisar do índice baseado em um, poderá fazer o seguinte:fonte
Você pode usar a
index
função do awk para retornar a posição nos caracteres em que a correspondência ocorre:Se você não se importa em usar a
index
função Perl , isso lida com o relato de zero, uma ou mais ocorrências de um personagem:Apenas para facilitar a leitura, o pipeline foi dividido em duas linhas.
Desde que o caractere alvo seja encontrado,
index
retorna um valor positivo com base em zero (0). Portanto, a cadeia "abc | xyz | 123456 | zzz |" quando analisado retorna as posições 0, 4, 8, 15 e 19.fonte
RAMSITALSKHMAN|1|223333
Também podemos fazer isso usando "expr match" ou "expr index"
expr corresponde a $ string $ substring em que $ substring é um RE.
E acima, você fornecerá a posição, pois retorna o comprimento da substring correspondente.
Mas, para ser mais específico na pesquisa de índice:
fonte
awk
soluções podem ser modificadas trivialmente para relatar essas informações em todas as linhas de um arquivo (tudo o que você precisa fazer é remover oEND
, o que nunca foi realmente necessário, da resposta de JRFerguson, e o Avinash Raj já o faz) ; considerando que, para fazer isso com aexpr
solução, você precisará adicionar um loop explícito (e a resposta do Gnouc não é facilmente adaptável a isso, pelo que vejo) e (2) asawk
soluções podem ser adaptadas para relatar todas as corresponde em cada linha um pouco mais facilmente do que aexpr
solução (na verdade, a Avinash Raj já faz isso também).echo `...`
aqui?Outro comando awk ,
Ao definir o separador de campos como sequência nula, o awk transforma caracteres individuais no registro como campos separados.
fonte
algumas alternativas incluem:
semelhante à resposta de Gnouc, mas com a casca:
com
sed
edc
possivelmente abrangendo várias linhas:com
$IFS
...Isso também irá dizer-lhe como muitos há como ...
fonte