У меня есть этот файл –
# # 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/'