вопрос о совпадении пробелов

У меня есть этот файл –

# # 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 

и я хочу искать и заменять

 xfirst = 0 

с

 xfirst = -180 

Я пробовал это на Ubuntu 16.04

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

и я получаю

 sed:No match 

Где я иду не так?

Вы забыли процитировать оператор [[:space:]] glob и используете оболочку вроде csh , tcsh , fish (хотя fish не поддерживает [...] операторы glob), zsh , bash -O failglob (скорее всего, (t)csh учетом сообщения об ошибке), который (по праву) не выполняет команду, когда glob не соответствует.

tcsh не распознает классы символов [:space:] POSIX, но это s/=[[:space:]]0/-180/ все еще распознается как glob.

После mkdir -p 's/=a]0/-180' , glob будет соответствовать. Это s/=[[:space:]]0/-180/ будет расширено до s/=a]0/-180/ и вы не получите ошибку No match

Вместо этого здесь вы хотите указать, что для оболочки не рассматривать ее как шаблон glob и передавать строку буквально в sed .

(Здесь я также добавляю отсутствующий * чтобы допускать 0 или более символов пробела в шаблоне, а отсутствующий = в замене):

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

Или сохранить исходный интервал:

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

Используйте следующее выражение sed :

 sed 's/^\(xfirst[[:space:]]*=[[:space:]]*\).*/\1-180/' file 

  • \1 – указывает на (xfirst....) захваченную группу (т. (xfirst....) )

Другой подход sed команды.

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

или таким образом.

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

или просто замените 0 на -180

  sed '/^xfirst/ s/0/-180/'