Abaixo está o trecho de um script de shell de um script maior. Ele remove as aspas da string mantida por uma variável. Estou fazendo isso usando sed, mas é eficiente? Caso contrário, qual é a maneira mais eficiente?
#!/bin/sh
opt="\"html\\test\\\""
temp=`echo $opt | sed 's/.\(.*\)/\1/' | sed 's/\(.*\)./\1/'`
echo $temp
sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$opt"
. Essa sintaxe removerá qoutes somente quando houver um par correspondente.Respostas:
Existe uma maneira mais simples e eficiente de usar o recurso de remoção de prefixo / sufixo nativo do shell:
${opt%\"}
removerá o sufixo"
(escapou com uma barra invertida para impedir a interpretação do shell).${temp#\"}
removerá o prefixo"
(escapou com uma barra invertida para impedir a interpretação do shell).Outra vantagem é que ele removerá as aspas circundantes apenas se houver aspas circundantes.
BTW, sua solução sempre remove o primeiro e o último caractere, sejam eles quais forem (é claro, tenho certeza de que você conhece seus dados, mas é sempre melhor ter certeza do que está removendo).
Usando sed:
(Versão melhorada, conforme indicado por jfgagne, eliminando o eco)
Portanto, substitui uma liderança
"
por nada e uma trilha"
por nada também. Na mesma chamada (não há necessidade de canalizar e iniciar outro sed. Usando-e
você pode ter vários processos de texto).fonte
sed -e 's/^"//' -e 's/"$//' <<< $opt
.sed
regex poderia ser usado, ou a substituição de variáveis poderia ser envolvido em algo linhacase $opt in '"'*'"') ... do it ... ;; esac
sed 's/^"\|"$//g'
Use tr para excluir
"
:Nota : Isso remove todas as aspas duplas, não apenas iniciais e finais.
fonte
Isso removerá todas as aspas duplas.
fonte
Don't remove this \" quote
,.:-(
Existe uma maneira direta de usar xargs :
O xargs usa eco como o comando padrão se nenhum comando for fornecido e retira aspas da entrada. Veja, por exemplo, aqui .
fonte
echo '"quoted"' | xargs
->quoted
Você pode fazer isso com apenas uma chamada para
sed
:fonte
O caminho mais curto - tente:
Na verdade, ele remove todos os
"
s (aspas duplas) deopt
(haverá realmente mais aspas duplas além do começo e do fim? Então é a mesma coisa e muito mais breve ;-))fonte
Se você estiver usando jq e tentando remover as aspas do resultado, as outras respostas funcionarão, mas há uma maneira melhor. Usando a
-r
opção, você pode gerar o resultado sem aspas.fonte
jq
mas observe que ele não funciona se o jq também estiver produzindo saída ASCII com-a
(é um bug no lado do jq)yq
também tem-r
opção:yq -r '.foo' file.yml
Atualizar
Uma resposta simples e elegante de Retirando aspas simples e duplas em uma string usando apenas comandos bash / padrão do Linux :
BAR=$(eval echo $BAR)
tiras citações deBAR
.==================================================== ===========
Com base na resposta de hueybois, criei essa função após muitas tentativas e erros:
Se você não quiser imprimir nada, pode canalizar os resultados
/dev/null 2>&1
.Uso:
fonte
A solução mais fácil no Bash:
Isso é chamado de expansão de substring (consulte o Manual do Gnu Bash e procure
${parameter:offset:length}
). Neste exemplo, a substrings
inicia na posição 1 e termina na segunda última posição. Isso se deve ao fato de que selength
for um valor negativo, ele é interpretado como um deslocamento para trás do final deparameter
.fonte
Esta é a maneira mais discreta sem usar o sed:
Ou
Resultado:
Eu recebi isso de uma fonte .
fonte
Existe outra maneira de fazer isso. Gostar:
fonte
Minha versão
A função aceita nomes de variáveis e retira aspas no lugar. Ele retira apenas um par correspondente de citações iniciais e finais. Ele não verifica se a citação à direita foi escapada (precedida por
\
qual não é escapada).Na minha experiência, funções utilitárias para cadeias de uso geral como esta (eu tenho uma biblioteca delas) são mais eficientes ao manipular as cadeias diretamente, sem usar nenhuma correspondência de padrões e, principalmente, sem criar subconchas ou chamar ferramentas externas, como
sed
,awk
ougrep
.fonte
Eu sei que esta é uma pergunta muito antiga, mas aqui está outra variação sed, que pode ser útil para alguém. Ao contrário de alguns outros, ele substitui apenas aspas duplas no início ou no final ...
fonte