從第一個實例文字 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只要]滿足包含字串的行。這意味著,我們已將第一個範圍列印到標準輸出/\$package/,/]/

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

相關內容