Pergunta

Eu estou escrevendo um script shell (bash) e eu estou tentando descobrir uma maneira fácil de realizar uma tarefa simples.

Eu tenho alguma corda em uma variável. Eu não sei se isso é relevante, mas pode conter espaços, novas linhas, porque na verdade essa string é o conteúdo de um arquivo de texto inteiro.

Quero substituir a última ocorrência de uma determinada substring com outra coisa. Talvez eu poderia usar uma expressão regular para isso, mas há dois momentos que me confundem:

  • Eu preciso corresponder a partir do final, não desde o início
  • o substring que eu quero para procurar é fixo, não variável.
Foi útil?

Solução

  • para truncando no início: ${var#pattern}
  • truncando no ${var%pattern} final
  • ${var/pattern/repl} para a substituição geral

os padrões são de expansão estilo 'filename', eo último pode ser prefixado com # ou % para corresponder apenas no início ou no fim (respectivamente)

é tudo na (longa) manpage bash. verificar o capítulo "Parâmetro de Expansão".

Outras dicas

expressão amn como este

s/match string here$/new string/

deve fazer o truque - S é para sustitute, / quebrar o comando, e os US $ é o fim do marcador de linha. Você pode tentar isso em vi para ver se ele faz o que você precisa.

Gostaria de olhar para cima as páginas man para awk ou sed.

A resposta de Javier é específico shell e não funcionará em todas as conchas.

As respostas sed que MrTelly e epochwolf aludidos são incompletos e deve ser algo como isto:

MyString="stuff ttto be edittted"
NewString=`echo $MyString | sed -e 's/\(.*\)ttt\(.*\)/\1xxx\2/'`

A razão funciona este sem ter que usar o $ para marcar o fim é que o primeiro '*' é ganancioso e tentará reunir-se, tanto quanto possível, permitindo que o resto da expressão regular para ser verdade.

Este comando sed deve funcionar bem em qualquer contexto shell usado.

Normalmente, quando eu ficar preso com Sed eu usar esta página,

http://sed.sourceforge.net/sed1line.txt

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top