Ich habe das folgende Array in einem Programm:
... #code
$packages = [
'git', # version control
...
'iftop', # monitor network usage by ip
'iotop', # monitor io usage
]
... #more code
Ich möchte awk
Zeilen vom ersten Vorkommen von $packages bis zum ersten Ende ]
nach dem Vorkommen von drucken $packages
.
Wie kann ich das machen?
Antwort1
Iterieren Sie über die Datensätze, behalten Sie eine Kennung für bei $packages
, drucken Sie die Zeilen, wenn die Kennung festgelegt ist, und beenden Sie den Vorgang nach dem Drucken, wenn Sie das nächste finden ]
:
awk '/\$packages/ {c=1; print; next} /\]/ {print; exit}; c{print}'
Beispiel:
% 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
]
Antwort2
Wir verwenden den range
Operator ,
„of“, sed
um den Zeilenbereich auszuwählen, der uns interessiert. In diesem Szenario beginnt der Bereich mit der Zeichenfolge $package
und endet mit ]
(auf unterschiedlichen Zeilen).
Zuerst verwerfen wir alle Zeilen außerhalb des Bereichs /\$package/,/]/!d
und drucken sie dann alle aus dem Bereich aus (aufgrund des impliziten Druckens der Musterbereichseigenschaft von sed
), ABER quit
sobald die Zeile mit der Zeichenfolge ]
erreicht ist, bedeutet dies, dass wir den ersten der Bereiche auf stdout gedruckt haben/\$package/,/]/
sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile