첫 번째 인스턴스 텍스트 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다음 범위에서 모든 줄을 인쇄합니다( 패턴 공간 속성의 암시적 인쇄로 인해 sed). 하지만 quit문자열이 있는 줄이 만나자마자 즉시 인쇄 ]합니다. 이는 우리가 첫 번째 범위를 stdout으로 인쇄했음을 의미합니다./\$package/,/]/

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

관련 정보