Basicamente, estou lendo a primeira linha de um arquivo e quero que o primeiro e o último caracteres sejam cortados, mas apenas se forem iguais a um determinado caractere. Estou tentando remover "{" e "}" de uma string, mas SOMENTE SE FOREM O PRIMEIRO E O ÚLTIMO CARACTERES, RESPECTIVAMENTE.
Entrada:
{Some_random_data_here, {more data here}, test}
Saída:
Some_random_data, {more data here}, test
Aqui está o comando completo que estou usando, que é capaz de remover o primeiro, mas não o último.
$(head -n 1 "$filePath" | sed s/^{//;s/}$//)
Código atual do OP e saída completa:
Sugestões:
$( .... )
wrapper, pois não queremos executar os resultados dosed
scriptsed
script entre aspas simples para que seja;
tratado como parte dosed
script (e não tratado como umbash
separador de comando)Fazendo estas alterações no código atual do OP:
Embora isso faça com que o código atual do OP funcione para esse dado específico, na verdade não atende ao requisito do OP de que ambos os caracteres devem existir antes de removê-los. Considere os seguintes exemplos em que um dos suportes de livros está faltando:
Em ambos os casos, o início
{
ou o final}
são removidos, mesmo que ambos os caracteres não existam.Uma
sed
ideia usando um grupo de captura e uma regex que corresponda aos dois suportes de livros:Onde:
-E
- permite suporte estendido a regex^\{
- corresponde ao início da entrada (^
) seguido por um{
; precisamos escapar do{
caso contrário ele será tratado como parte dased
linguagem de script, ou seja, queremos que seja tratado como literal{
}$
- corresponde}
ao final da entrada ($
)(.*)
- (primeiro) grupo de captura que corresponde a tudo entre^{
e}$
\1
- referenciar o conteúdo do (primeiro) grupo de captura^{
e}$
^{
e}$
Sua solução funcionou quando testei, só precisei escapar do arquivo
;
.Com
bash
versão >= 3.0 e um regex:Saída:
A leitura da primeira linha e a remoção de colchetes podem ser feitas com
sh
código shell POSIX puro ( ) (para que funcione com Bash, Dash e outros):Se você deseja remover chaves apenas quando as chaves de abertura e fechamento estiverem presentes, este código shell POSIX faz isso:
Observe que encadear
sed
expressões':'
é bom ao usar GNUsed
, mas nem todossed
suportam isso. Nesse caso, você pode dividir as expressões de substituição com-e
opções separadas usando referências anteriores numeradas como:ou o corte inicial/final equivalente:
Exemplo de uso/saída
ou
ou
ou
Apenas uma advertência a ser observada se você se deparar com um sistema estranho.