sed 空格匹配问题

sed 空格匹配问题

我有这个文件 -

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

我哪里出错了?

答案1

您忘记引用[[:space:]]glob 运算符并使用像csh, tcsh, fish(尽管fish不支持[...]glob 运算符), zsh, bash -O failglob(很可能(t)csh给出错误消息)这样的 shell,当 glob 无法匹配时,(正确地)使命令失败。

tcsh无法识别[:space:]POSIX 字符类,但s/=[[:space:]]0/-180/仍被识别为 glob。

在 a 之后mkdir -p 's/=a]0/-180',glob 将匹配。这s/=[[:space:]]0/-180/将扩展到s/=a]0/-180/并且您不会收到No match错误。

相反,在这里,您想要引用该内容,以便 shell 不将其视为全局模式并将字符串按字面意思传递给sed.

(在这里,我还添加了缺失的内容*以允许模式中存在 0 个或多个空格字符,以及=替换中缺失的内容):

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

或者保留原始间距:

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

答案2

使用以下内容sed表达:

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

  • \1- 指向第一个捕获的组(即(xfirst....)

答案3

另一种sed命令方法。

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

或者这样。

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

或者简单地替换0-180

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

相关内容