![sed 空格匹配问题](https://linux22.com/image/116909/sed%20%E7%A9%BA%E6%A0%BC%E5%8C%B9%E9%85%8D%E9%97%AE%E9%A2%98.png)
我有这个文件 -
#
# 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/'