내 프로그램에는 다음과 같은 배열이 있습니다.
... #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