私のプログラムには次のような配列があります。
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
awk
$packagesの最初の発生から発生の]
最初の終わりまで行を印刷するために使用したいと思います$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
演算子を使用して目的の行範囲を選択します,
。sed
この場合、範囲は文字列で始まり(別の行で)で終わります$package
。]
まず、範囲外のすべての行を拒否してから、範囲内のすべての/\$package/,/]/!d
行を印刷します(patternspace属性の暗黙的な印刷のためsed
)。ただし、文字列を含む行が満たされるquit
場合にのみ該当します。]
これは、最初の範囲を標準出力として印刷したことを意味します。/\$package/,/]/
sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile