プログラム内に次の配列があります。
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
awk
の最初の出現から の]
出現後の最初の終了までの行を印刷するために を使用したいと思います$packages
。
これどうやってするの?
答え1
レコードを反復処理し、 の識別子を保持し$packages
、識別子が設定されている場合は行を印刷し、次の が見つかったら印刷後に終了します]
。
awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}'
例:
% cat file.txt
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
% awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}' file.txt
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
答え2
関心のある行の範囲を選択するには、range
演算子 of,
を使用します。このシナリオでは、範囲は文字列で始まり、 (異なる行)で終わります。sed
$package
]
まず、範囲外の行を拒否し、/\$package/,/]/!d
次に範囲からすべてを印刷します(のパターンスペースプロパティの暗黙的な印刷のためsed
)。ただし、quit
文字列の行に遭遇するとすぐに]
、範囲の最初の行が標準出力に印刷されます。/\$package/,/]/
sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile