sed: substitui qualquer número de ocorrências de um certo padrão

5

Dada essa entrada:

 "hell -- 'this -- world --is'-- beautiful' --thanks-- we'-- are-- here" 

Eu quero substituir cada '-' entre aspas simples por 'X-X-X' usando sed . Deve dar a seguinte saída:

output: "hell - 'este mundo X-X-X X-X-Xis' - bonito 'X-X-Xthanks X-X-X we' - está aqui"

O número de substituições pode ser desconhecido (até o infinito).

    
por shiva 18.03.2011 / 18:40

4 respostas

9

Editar:

Usando seu novo requisito:

sed 's/\o47[^\o47]*\o47/\n&\n/g;:a;s/\(\n\o47[^\n]*\)--/X-X-X/;ta;s/\n//g' input file

Editar 2:

Para algumas versões do sed que não gostam de ponto e vírgula:

sed -e 's/\o47[^\o47]*\o47/\n&\n/g' -e ':a' -e 's/\(\n\o47[^\n]*\)--/X-X-X/' -e 'ta' -e 's/\n//g' inputfile

Se o seu sed também não suporta códigos de escape octal:

sed -e "s/'[^']*'/\n&\n/g" -e ':a' -e "s/\(\n'[^\n]*\)--/X-X-X/" -e 'ta' -e 's/\n//g' inputfile

Resposta original:

Normalmente, você deve usar aspas simples para circundar o script sed , para não ter que escapar de caracteres que possam ser especiais para o shell. Mesmo que não seja necessário, neste caso, é um bom hábito desenvolver.

sed 's/--/X-X-X/g' inputfile

ou

var="hell --this -- world is --beaut--iful"
newvar=$(echo "$var" | sed 's/--/X-X-X/g')

Sem o modificador g , a substituição é executada na primeira correspondência em cada linha de entrada. Quando g é usado, cada correspondência em cada linha de entrada é substituída. Você também pode fazer a substituição de determinadas correspondências:

$ var="hell --this -- world is --beaut--iful"
$ echo "$var" | sed 's/--/X-X-X/2'
hell --this X-X-X world is --beaut--iful
    
por 18.03.2011 / 20:47
7

Você deseja usar a opção / g no final para analisar mais de uma substituição por linha.

sed s/--/X-X-X/g
    
por 18.03.2011 / 18:43
5
$ echo "hell --this -- world is --beaut--iful" | sed s"/--/X-X-X/g"
hell X-X-Xthis X-X-X world is X-X-XbeautX-X-Xiful

A chave é a opção g : faz com que sed substitua todas as ocorrências.

    
por 18.03.2011 / 18:44
0
echo "     -- hell     -- this ------   world       ---- test"  |\
sed -r 's/[ ]+[-]+[ ]+/ x-x-x /g'

Dá:

 x-x-x hell x-x-x this x-x-x world x-x-x test

A sequência de caracteres entre parênteses é correspondida por uma repetição uma ou mais vezes pelo símbolo mais.

    
por 23.01.2017 / 06:51

Tags