Estou escrevendo um shell script para Linux embarcado em uma pequena caixa industrial. Eu tenho uma variável que contém o texto pid: 1234
e quero remover os primeiros caracteres X da linha, para que apenas 1234 permaneçam. Eu tenho mais variáveis que preciso "limpar", então preciso cortar os primeiros caracteres X e ${string:5}
não funcionar por algum motivo no meu sistema.
A única coisa que a caixa parece ter é sed
.
Estou tentando fazer o seguinte funcionar:
result=$(echo "$pid" | sed 's/^.\{4\}//g')
Alguma ideia?
${string:5}
não funcionar, você não está usando o Bash ou outro shell que suporte essa sintaxe. Qual shell e versão você está usando? Como é o seu shebang? Meu palpite é que você está usandosh
(comodash
) ou possivelmentezsh
.Respostas:
Isso também fará o trabalho:
fonte
awk -F": " '{print $2}'
. Ainda assim, não é minha solução favorita.O seguinte deve funcionar:
Você tem certeza de que
bash
o shell está executando seu script?Até o compatível com POSIX
seria preferível usar um processo externo, embora isso exija que você codifique os 5 na forma de um padrão de comprimento fixo.
fonte
${var:5:2}
iniciará1
e retornará12
.Aqui está um método conciso para cortar os primeiros caracteres X usando
cut(1)
. Este exemplo remove os 4 primeiros caracteres cortando uma substring começando com o 5º caractere.fonte
git log --pretty=oneline | cut -c 42- | head
cut -c ${LEN}-
. As chaves são usadas para concatenar a sequência com caracteres variáveis válidos, a fim de distinguir qual é a variável e o que não é. Se você quiser obter mais informações, consulte "concatenação de cadeias de caracteres de variável bash" para obter mais recursos sobre por que / como isso funciona.Use a
-r
opção ("use expressões regulares estendidas no script")sed
para usar a{n}
sintaxe:fonte
sed -r 's/.{5}$//'
para tirar os últimos 5 caracteres em vez-r
(-E
no OS X, IIRC) se você escapar do aparelho (embora não saiba se isso funciona no OS X).-r
/-E
) funciona no OS X.Corte os dois primeiros caracteres da string:
fonte
conduza através de
awk '{print substr($0,42)}'
onde 42 é um a mais que o número de caracteres a serem descartados. Por exemplo:fonte
As chances são de que você também terá
cut
. Se então:fonte
cut
é que ele não lida com seqüências de espaço em branco de maneira sensata, usandotr -s ' '
para "espremer" espaços faz com que ele se comporte melhor.Bem, tem havido soluções aqui com
sed
,awk
,cut
e usandobash
a sintaxe. Eu só quero jogar em outra variante de conformidade POSIX:-c
informa à cauda na qual o deslocamento de byte deve começar, contando desde o final dos dados de entrada, mas se o número começa com um+
sinal, é do início dos dados de entrada até o final.fonte
Outra maneira, usando em
cut
vez desed
.fonte
Eu encontrei a resposta em puro sed fornecida por esta pergunta (é verdade, postada depois que essa pergunta foi postada). Isso faz exatamente o que você pediu, exclusivamente no sed:
O ponto em
sed '/./
) é o que você deseja corresponder. Sua pergunta é exatamente o que eu estava tentando fazer, exceto que, no meu caso, eu queria corresponder uma linha específica em um arquivo e descomentá-la. No meu caso, foi:O
-i
seguintesed
é editar o arquivo no local (remova essa opção se desejar testar sua expressão correspondente antes de editar o arquivo).(Publiquei isso porque queria fazer isso inteiramente com o sed, conforme a pergunta e nenhuma das respostas anteriores resolveu esse problema.)
fonte
Em vez de remover n caracteres desde o início, talvez você possa extrair os dígitos diretamente. Igual a...
Essa pode ser uma solução mais robusta e parece mais intuitiva.
fonte