从第一个实例文本 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,设置标识符时打印行,并在找到 next 时打印后退出]

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

相关内容