テキストAの最初のインスタンスからテキストBの最初のインスタンスに印刷[重複]

テキストAの最初のインスタンスからテキストBの最初のインスタンスに印刷[重複]

私のプログラムには次のような配列があります。

  ... #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

関連情報