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

glob演算子を引用するのを忘れて、(glob演算子はサポートされていませんが)、(エラーメッセージが表示される可能性が高い)、(正しく)globが一致しないときにコマンドが失敗する[[:space:]]シェルを使用しました。cshtcshfishfish[...]zshbash -O failglob(t)csh

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

代わりに、シェルはこれをグローバルパターンとして扱わずに文字列を文字通りsed

*(ここでパターンにゼロ個以上の空白文字を許可するために、欠落している内容と=代替項目から欠落している内容も追加しました。)

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/'

関連情報