ガベージがN回以上繰り返される可能性がある行を含むTestData.txtファイルがあり、「Model = Default」行の位置が固定されていない場合
...
junk
junk
Model="C"
junk
junk
Size="81"
junk
Model="Default" <---- Start of "Default" block
junk
...
junk
Size="47" <---- Required value of size (first "Size=" line after "Default")
junk
junk
Model="A"
junk
Size="22"
junk
junk
Model="T"
junk
junk
Size="32"
junk
...
デフォルトでは、サイズ値を抽出したい場合は、一致する行を印刷してから2番目のsedコマンドを置き換えて適用してサイズ値を抽出するように機能します。
sed -ne '/="Default"/,/Size=/p' TestData.txt | sed -ne 's|Size="\([1-9][0-9]*\)"|\1|p'
この印刷47、デフォルト値セクションのサイズパラメータに必要な値。
2つのsed操作をより効率的な単一のsed呼び出しに結合できますか?
(これは、「サイズ」仕様を含む複数のブロックを含む構成ファイルから単一の値を抽出するために、より複雑な正規表現を使用する実際の操作の簡略化された形式です。)
答え1
2番目のフィルタを次のように追加できる必要があります。サブ式中かっこの間
sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p}' TestData.txt
またはPOSIXly
sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p
}' TestData.txt
バラよりsedでコマンドを編集する
[2addr] {function function ... }
sed 関数のリストは、パターン空間が選択されている場合にのみ実行されます。 sed関数のリストは中括弧で囲み、改行で区切る必要があり、次の規則に従う必要があります。中かっこの前または後にスペースがある場合があります。関数の前にはスペースを含めることができますが、後ろにスペースを含めることはできません。中括弧の前に改行文字を含める必要があり、その前または後にスペースがある場合があります。