最初のインスタンスのテキスト A から最初のインスタンスのテキスト B まで印刷します

最初のインスタンスのテキスト A から最初のインスタンスのテキスト B まで印刷します

プログラム内に次の配列があります。

  ... #code
  $packages = [ 
    'git',        # version control
     ...
    'iftop',      # monitor network usage by ip
    'iotop',      # monitor io usage
  ]
  ... #more code

awkの最初の出現から の]出現後の最初の終了までの行を印刷するために を使用したいと思います$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演算子 of,を使用します。このシナリオでは、範囲は文字列で始まり、 (異なる行)で終わります。sed$package]

まず、範囲外の行を拒否し、/\$package/,/]/!d次に範囲からすべてを印刷します(のパターンスペースプロパティの暗黙的な印刷のためsed)。ただし、quit文字列の行に遭遇するとすぐに]、範囲の最初の行が標準出力に印刷されます。/\$package/,/]/

sed -e '/\$packages/,/]/!d; /]/q' yourfile
sed -n '/\$packages/,/]/p; /]/q' yourfile

関連情報