sed pergunta de correspondência de espaço em branco

1

Eu tenho este arquivo -

#
# gridID 1
#
gridtype  = lonlat
gridsize  = 10512
xsize     = 144
ysize     = 73
xname     = lon
xlongname = "longitude"
xunits    = "degrees_east"
yname     = lat
ylongname = "latitude"
yunits    = "degrees_north"
xfirst    = 0
xinc      = 2.5
yfirst    = 90
yinc      = -2.5

e quero pesquisar e substituir

xfirst  = 0 

com

xfirst = -180

Eu tentei isso no Ubuntu 16.04

sed s/=[[:space:]]0/-180/

e eu recebo

sed:No match

Onde estou indo errado?

    
por gansub 28.08.2017 / 16:02

3 respostas

2

Você se esqueceu de citar o operador [[:space:]] glob e está usando um shell como csh , tcsh , fish (embora fish não suporte [...] glob operadores), zsh , bash -O failglob (provavelmente (t)csh dada a mensagem de erro) que (corretamente) falha o comando quando uma glob falha ao combinar.

tcsh não reconhece as classes de caracteres [:space:] POSIX, mas s/=[[:space:]]0/-180/ ainda é reconhecido como glob.

Após um mkdir -p 's/=a]0/-180' , o glob corresponderia. Esse s/=[[:space:]]0/-180/ seria expandido para s/=a]0/-180/ e você não receberia o erro No match .

Em vez disso, aqui, você quer citar que o shell não deve considerá-lo como um padrão glob e passar a string literalmente para sed .

(Aqui, também estou adicionando o * ausente para permitir 0 ou mais caracteres de espaçamento no padrão e o = ausente na substituição):

sed 's/=[[:space:]]*0/=-180/'

Ou para preservar o espaçamento original:

sed 's/\(=[[:space:]]*\)0/-180/'
    
por 28.08.2017 / 16:22
1

Use a seguinte expressão sed :

sed 's/^\(xfirst[[:space:]]*=[[:space:]]*\).*/-180/' file
  • - aponta para o primeiro grupo capturado (por exemplo, (xfirst....) )
por 28.08.2017 / 16:05
1

Outra abordagem de comando sed .

sed '/^xfirst/ s/\d\+/-180/'

ou assim.

sed '/^xfirst/ s/[0-9]+/-180/'

ou simplesmente substitua 0 por -180

    sed '/^xfirst/ s/0/-180/'
    
por 28.08.2017 / 16:13