Eu tenho uma string que gostaria de manipular. A string é H08W2345678
como eu seria capaz de manipulá-la para que a saída seja justa W2345678
?
Da mesma forma, se eu quisesse soltar os últimos 4 caracteres H08W2345678
para que eu entendesse, H08W234
como faria isso?
bash
shell
text-processing
sed
3kstc
fonte
fonte
sed
?H08W2345678
e precisa manipulá-lo paraW2345678
Este valor com outro dado será colocado em um email enviado. Este e-mail será realizado com o cron.awk
ing. I criar uma matriz e em seguida modificar cada um dos elementos dentro da matriz (todos de maneira diferente - ou seja, alterar o Epoch timestaimp em segundos para uma data, etc.)printf %s\\n "XX,H08W2345678,YY" | awk -F, '{print substr($2, 4); print substr($2, 1, length($2)-4)}'
Respostas:
Apenas usando o bash (ou de
ksh93
onde vem essa sintaxe ouzsh
):Veja o wiki do Wooledge para mais informações sobre manipulação de strings .
fonte
"${string:0:${#string}-4}"
funciona em bash versão 4.1, enquanto o comprimento de$string
pelo menos 4.abc-e
, onde, quando você solta os três primeiros caracteres, você fica com-e
(porqueecho -e
não faz o que você gostaria).sed 's/^.\{3\}//'
encontrará os três primeiros caracteres por^.\{3\}
e substituirá por em branco. Aqui^.
corresponderá qualquer caractere no início da sequência (^
indica o início da sequência) e\{3\}
corresponderá ao padrão anterior exatamente 3 vezes. Então,^.\{3\}
irá coincidir com os três primeiros caracteres.Da mesma forma,
sed 's/.\{4\}$//'
substituirá os últimos quatro caracteres por branco ($
indica o final da sequência).fonte
's/^.\{3\}//'
e's/.\{4\}$//'
como eu ainda estou aprendendo sed, muito obrigado...
em vez de.\{3\}
uma vez (para mim) é mais fácil de ler:sed -e 's/^...//' -e 's/....$//'
ou numa única expressão com alternância:sed -r 's/^...|....$//g'
. Se houvesse mais do que alguns caracteres para excluir, usaria a/.\{17}\/
expressão em vez de/.............../
.-e
ou-n
. Claro, o significado de “soltar os últimos 4 caracteres” é indefinido para uma cadeia menor que 4 caracteres, mas, se alguém queria adaptar este deixar cair a primeira ou a última de um personagem, que poderia explodir.Se você possui um arquivo no qual cada linha é uma cadeia de onze caracteres (ou o que for) que você deseja cortar,
sed
é a ferramenta a ser usada. É bom manipular uma única string, mas é um exagero. Para uma única sequência, a resposta de Jason é provavelmente a melhor, se você tiver acesso ao bash versão 4.2 ou superior. No entanto, as sintaxes e parecem exclusivas do bash (bem, bash, ksh93, mksh e zsh) - não as vejo nas Especificações Básicas do Grupo Aberto para a Linguagem de Comando do Shell . Se você estiver preso com um shell compatível com POSIX que não suporta expansão de substring (extração), poderá usar${parameter:offset}
${parameter:offset:length}
usando em
printf
vez deecho
para se proteger de seqüências de caracteres comoabc-e
, onde, quando você solta os três primeiros caracteres, você fica com-e
(eecho -e
não faz o que deseja).E, se você não estiver usando um shell da família Bourne (ou estiver usando um sistema antigo pré-POSIX), eles ainda deverão funcionar:
O espaço à esquerda extra é para evitar problemas com valores de
$string
que são reaisexpr
operadores (por exemplo,+
,/
,index
oumatch
) ou opções (por exemplo,--
,--help
ou--version
).fonte
X
; por exemploexpr "X$string" : 'X...\(.*\)'
,. Na IMO, é mais fácil ler e entender. Existe algum problema com isso ou algum motivo para preferir um espaço? (3) Hoje eu aprendi queexpr + "$string" : '...\(.*\)'
agora funciona. Não me lembro disso de 40 anos atrás; é suficientemente utilizado para ser seguro recomendar? (4) Você perdeu uma nota sobre a resposta de jasonwryan e uma picareta sobre a resposta de heemayl.expr +
é apenas GNU (não funcionará no Solaris nem no FreeBSD AFAICS). Uso espaço em vez de x, pois é menos provável que algumaexpr
implementação tenha operadores que iniciam com espaço do que comx
e também porque é menos provável que haja elementos de intercalação que começam com espaço do que comx
. Mas então percebo que provavelmente não é uma boa opção paraexpr " $a" "<" " $b"
comparação de cadeias, pois algumas implementações acabam fazendo comparação numérica quando$a
/$b
parecem números. Talvezexpr "@@$a"...
ouexpr "x $a"
possa ser mais seguro.Com:
Combinar 3 ou 4 caracteres parece simples (para a maioria das conchas):
Para as conchas mais antigas (como a concha Bourne), use:
Se for necessária uma contagem numérica de caracteres, use:
Obviamente, esses regex também funcionam com sed, awk e bash 3.0+:
fonte
fonte
cut
é muito mais elegante do que qualquer outra coisa nesta página.