我的程序中有以下数组:
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
我想用来awk
打印从 $packages 第一次出现到]
出现后的第一个结尾的行$packages
。
我怎样才能做到这一点?
答案1
遍历记录,保留 的标识符$packages
,设置标识符时打印行,并在找到 next 时打印后退出]
:
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