Qual é o propósito de “~” no comando “sed's ~ ~~ g '”? [duplicado]

27

Encontrei a linha sed 's~ ~~g' em um script de shell em um sistema Linux. O que é isso ~ ?

    
por sourabh malavade 11.05.2018 / 09:52

2 respostas

54

É um delimitador alternativo para o comando sed substitute ( s ). Normalmente, a barra é usada, como em s/pattern/replacement/ , mas sed permite que quase qualquer caractere seja usado.

O principal motivo para usar outro delimitador do que / na expressão de substituição sed é quando a expressão atua no literal / caracteres.

Por exemplo, para substituir o caminho /some/path/here por /other/path/now , pode-se fazer

s/\/some\/path\/here/\/other\/path\/now/

Isso sofre do que é geralmente chamado de "síndrome do palito inclinado" , o que significa que é difícil ler e interpretar corretamente manter.

Em vez disso, podemos usar outro delimitador de expressão:

s#/some/path/here#/other/path/now#

Usar ~ é apenas outro exemplo de um delimitador de expressão de substituição válido.

Sua expressão

s~ ~~g

é o mesmo que

s/ //g

e removerá todos os espaços da entrada. Nesse caso, não é necessário usar outro delimitador além de / , pois nem o padrão nem a substituição contêm / .

Outra maneira de fazer o mesmo é

tr -d ' ' <infile >outfile
    
por 11.05.2018 / 10:11
18

É um delimitador de substituição. O delimitador usado com mais freqüência é uma barra invertida / . Mas sed pode usar qualquer caractere como um delimitador - ele usará automaticamente o caractere seguindo o s como um delimitador:

sed 's@ @@g'
sed 's+ ++g'
sed 's\ \g'
sed 's* **g'

Também é possível usar espaço como delimitador:

echo "foo" | sed 's foo bar g'

Outros delimitadores do que / são mais usados quando você tem muitas barras em seu comando na sintaxe está ficando confuso. Considere este caso em que queremos converter vários espaços em apenas um caractere de espaço: em vez de

echo "    a   b  c  " | sed 's/\s\{1,\}/ /g'

você pode correr

echo "    a   b  c  " | sed 's~\s\{1,\}~ ~g'

que é mais claro.

    
por 11.05.2018 / 10:04

Tags