Drucken von der ersten Instanz von Text A bis zur ersten Instanz von Text B

Drucken von der ersten Instanz von Text A bis zur ersten Instanz von Text B

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 awkZeilen 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 rangeOperator ,„of“, sedum den Zeilenbereich auszuwählen, der uns interessiert. In diesem Szenario beginnt der Bereich mit der Zeichenfolge $packageund endet mit ](auf unterschiedlichen Zeilen).

Zuerst verwerfen wir alle Zeilen außerhalb des Bereichs /\$package/,/]/!dund drucken sie dann alle aus dem Bereich aus (aufgrund des impliziten Druckens der Musterbereichseigenschaft von sed), ABER quitsobald 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

verwandte Informationen