我的程式中有以下數組:
... #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
然後從範圍中列印所有行(由於 的模式空間屬性的隱式列印sed
),但quit
只要]
滿足包含字串的行。這意味著,我們已將第一個範圍列印到標準輸出/\$package/,/]/
sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile