两个分隔符之间的grep子字符串

Ulr*_*rik 3 regex bash perl grep busybox

我有很多bash脚本使用perl表达式grep来提取两个分隔符之间的子字符串.例:

echo BeginMiddleEnd | grep -oP '(?<=Begin).*(?=End)'
Run Code Online (Sandbox Code Playgroud)

问题是,当我将这些脚本移植到运行的平台时busybox,"集成" grep无法识别-P开关.是否有一种干净的方法来使用grepregular expressions

编辑:没有perl,sedawk在该平台上.这是一个轻量级linux.

anu*_*ava 8

您可以使用这样awk的自定义字段分隔符来获得相同的输出:

echo 'BeginMiddleEnd' | awk -F 'Begin|End' '{print $2}'
Middle
Run Code Online (Sandbox Code Playgroud)

  • 稍微解释一下也没什么坏处;)。-F 选项似乎是字段分隔符...但是 `|` 在 `-F 'Begin|End'` 中有何魔力? (3认同)

Vyt*_*nis 5

假设每行最多发生一次,则可以使用

sed -nr 's/.*Begin(.*)End.*/\1/p'
Run Code Online (Sandbox Code Playgroud)

使用grep和非贪婪量词,您还可以每行打印多个。