![如何 grep 给定分隔符之间的第 n 个子字符串?](https://linux22.com/image/62278/%E5%A6%82%E4%BD%95%20grep%20%E7%BB%99%E5%AE%9A%E5%88%86%E9%9A%94%E7%AC%A6%E4%B9%8B%E9%97%B4%E7%9A%84%E7%AC%AC%20n%20%E4%B8%AA%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
假设我们有一个字符串,它的分隔符是?
:
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[^?]*"
更改2
该n - 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