Sed com classe de caractere [^ [: space:]] não sendo reconhecido

0

Eu usei o seguinte sed com a classe de caractere [^[:space:]] da seguinte forma:

orig="(\'\'\')([^[:space:]]*)"; 
new="{. .numberLines startFrom=\"1\" .lineAnchors}"; 
sed -i -r -e "s|${orig}|${new}|g" ${InterimFilePath} ; 

Entrada:

'''bash
ls
'''

Saída:

'''{.bash .numberLines startFrom="1" .lineAnchors}
ls
'''{.bash .numberLines startFrom="1" .lineAnchors}

Resultado esperado:

'''{.bash .numberLines startFrom="1" .lineAnchors}
ls
'''

Alguma sugestão? Também tentei a classe de caracteres [[:alnum:]] , mas o resultado é o mesmo que acima.

    
por Nikhil 18.09.2018 / 14:11

2 respostas

1

A saída que recebo com o GNU sed e com o nativo sed no OpenBSD é

'''{.bash .numberLines startFrom="1" .lineAnchors}
ls
'''{. .numberLines startFrom="1" .lineAnchors}

Isso ocorre porque sua expressão corresponde a zero ou mais caracteres não espaciais após os três backticks. Alterar [^[:space:]]* para [^[:space:]]+ forçaria a correspondência de pelo menos um caractere não espacial.

Isso fornece a saída esperada de

'''{.bash .numberLines startFrom="1" .lineAnchors}
ls
'''

Você também pode usar aspas simples em suas atribuições de variáveis. Isso faz com que as strings sejam mais nítidas, sem a necessidade de escapar de caracteres especiais para protegê-las do shell:

orig='(''')([^[:space:]]+)'
new='{. .numberLines startFrom="1" .lineAnchors}'
sed -i -E "s|$orig|$new|g" "$InterimFilePath"
    
por 18.09.2018 / 14:25
1

tente isso,

orig="(\'\'\')([[:alnum:]]+)";
new="{. .numberLines startFrom=\"1\" .lineAnchors}"; 
sed -i -r -e "s|${orig}|${new}|g" ${InterimFilePath} ; 

Saída

'''{.bash .numberLines startFrom="1" .lineAnchors}
ls
'''
  • use + em vez de * , pois * corresponderá a everthing.
por 18.09.2018 / 14:23