如何 grep 给定分隔符之间的第 n 个子字符串?

如何 grep 给定分隔符之间的第 n 个子字符串?

假设我们有一个字符串,它的分隔符是?

Leslie Cheung April 1 ? Elvis August 16 ? Leonard Nimoy February 27

我知道如何grep分隔符之间的第一个子字符串:

echo $above_string | grep -oP "^[^?]*"
Leslie Cheung April 1

我应该如何更改正则表达式才能 grep 第二个或第三个子字符串?

答案1

使用剪切怎么样?如果您想打印第二个图案

echo "$above_string" | cut -f2 -d "?"

第二栏往后

echo "$above_string" | cut -f2- -d "?"

答案2

echo $above_string | grep -oP "^([^?]*\?){2}\K[^?]*"

更改2n - 1值以获得第 n 个字符串。

这假设您想要第 n 个字符串在那条线上。您有 n - 1 个不?以文字“?”结尾的字符串(\?因为它是 perl 正则表达式中的特殊字符)。然后,\K您声明您对前面的内容不感兴趣,因此仅提取以下文本,直到下一个分隔符。

答案3

使用 awk 打印以换行符分隔的第二条和第三条记录:

awk -F"?" '{printf "%s\n%s\n", $2,$3}'
Elvis August 16 
Leonard Nimoy February 27

如果你想换出记录,可以将其设置为变量:

awk -v record=2 -F"?" '{print $record}'
Elvis August 16 

答案4

sed

您可以使用 sed 来实现此目的,但不建议这样做,例如,这是一个从零开始的解决方案,它使用量词来选择所需的字段:

n=1
sed 's/\([^?]*? *\)\{'$n'\}//; s/?.*//' <<<"$above_string"

输出:

Elvis August 16 

相关内容