Pesquisar e substituir em Shell
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.
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,