Apenas usando bash (ou ksh93 de onde vem essa sintaxe ou zsh ):
string="H08W2345678"
echo "${string:3}"
W2345678
echo "${string:0:-4}"
H08W234
Veja o wiki do Wooledge para saber mais sobre manipulação de string .
Eu tenho uma string que gostaria de manipular. A string é H08W2345678 , como eu poderia manipulá-la para que a saída seja apenas W2345678 ?
Da mesma forma, se eu quisesse eliminar os últimos 4 caracteres de H08W2345678 para que eu obtivesse H08W234 , como eu faria isso?
Apenas usando bash (ou ksh93 de onde vem essa sintaxe ou zsh ):
string="H08W2345678"
echo "${string:3}"
W2345678
echo "${string:0:-4}"
H08W234
Veja o wiki do Wooledge para saber mais sobre manipulação de string .
$ echo "H08W2345678" | sed 's/^.\{3\}//'
W2345678
sed 's/^.\{3\}//' encontrará os três primeiros caracteres em ^.\{3\} e substituirá por branco. Aqui ^. corresponderá a qualquer caractere no início da string ( ^ indica o início da string) e \{3\} corresponderá ao padrão anterior exatamente 3 vezes. Então, ^.\{3\} irá corresponder aos três primeiros caracteres.
$ echo "H08W2345678" | sed 's/.\{4\}$//'
H08W234
Da mesma forma, sed 's/.\{4\}$//' substituirá os quatro últimos caracteres em branco ( $ indica o final da string).
Se você tem um arquivo no qual cada linha é
uma cadeia de onze caracteres (ou qualquer outra) que você queira cortar,
sed é a ferramenta a ser usada.
É bom para manipular uma única string, mas é um exagero.
Para uma única string, a resposta de Jason é provavelmente a melhor,
se você tiver acesso ao bash versão 4.2 ou superior.
No entanto, o ${parameter:offset}
e ${parameter:offset:length} sintaxes
parece ser exclusivo para bash (bem, bash, ksh93, mksh e zsh) -
Eu não os vejo
em As especificações básicas do grupo aberto para a linguagem de comando do Shell .
Se você está preso a um shell compatível com POSIX
que não suporta expansão de substring (extração), você pode usar
$ printf "%s\n" "${string#???}"
W2345678
$ printf "%s\n" "${string%????}"
H08W234
usando printf em vez de echo para proteger contra strings como abc-e ,
onde, quando você soltar os três primeiros caracteres, você fica com -e
(e echo -e não faz o que você deseja).
E, se você não estiver usando um shell da família Bourne (ou você está usando um antigo sistema pré-POSIX), eles ainda devem funcionar:
$ expr " $string" : ' ...\(.*\)'
W2345678
$ expr " $string" : ' \(.*\)....'
H08W234
O espaço extra extra é para evitar problemas com valores de $string
que são operadores expr reais (por exemplo, + , / , index ou match )
ou opções (por exemplo, -- , --help ou --version ).
Com:
string="H08W2345678"
Correspondência de 3 ou 4 caracteres parece simples (para a maioria das shells):
$ printf '%s\t%s\n' "${string#???}" "${string%????}"
W2345678 H08W234
Para os shells mais antigos (como o shell Bourne), use:
$ string=H08W2345678
$ expr " ${string}" : " ...\(.*\)"
W2345678
$ expr " ${string}" : " \(.*\)...." '
H08W234
Se for necessária uma contagem numérica de caracteres, use:
$ expr " ${string}" : " .\{3\}\(.*\)"
W2345678
$ expr " ${string}" : " \(.*\).\{4\}" '
H08W234
Claro, esses regex funcionam também com sed, awk e bash 3.0 +:
$ echo "$string" | sed 's/^.\{3\}//'
W2345678
$ echo "$string" | sed 's/.\{4\}$//'
H08W234
$ echo "$string" | awk '{sub(/^.{3}/,"")}1'
W2345678
$ echo "$string" | awk '{sub(/.{4}$/,"")}1'
H08W234
$ r='^.{3}(.*)$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
W2345678
$ r='^(.*).{4}$'; [[ $a =~ $r ]] && echo "${BASH_REMATCH[1]}"
H08W234
Tags bash text-processing sed shell