Linux的shell匹配模式之间提取子
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的shell匹配模式之间提取子相关的知识,希望对你有一定的参考价值。
比方说,我有一个字符串poskek|gfgfd|XLSE|a1768|d234|uijjk
,我想只提取LSE
部分。
我只知道会有LSE前|X
直接,|
部分后直接我感兴趣的LSE
。
答案
对方的回答使用sed
应该工作,但是我总是觉得sed
是一个有点尴尬的正则表达式的选择,因为它真的打算更换(所以为什么需要与.*
和你真正想要的需求的部分两侧图案的两侧是在括号中)。下面是使用grep
的解决方案:
grep -Po '\|X\K[^|]+'
-P
信号grep
使用Perl的正则表达式引擎,它是更先进
-o
只打印该行的匹配的部分
\|X
匹配一个竖线和资本X
\K
忘记目前已被匹配(不包括在最终输出)
[^|]+
比竖线其他一个或多个字符
另一答案
作为一个纯粹的bash解决方案,请尝试:
str='poskek|gfgfd|XLSE|a1768|d234|uijjk'
ext=$str#*|X
ext=$ext%%|*
echo "$ext"
如果正则表达式是可用的,以下也适用:
if [[ $str =~ .*\|X([^|]+) ]]; then
echo "$BASH_REMATCH[1]"
fi
另一答案
echo 'poskek|gfgfd|XLSE|a1768|d234|uijjk' | sed -n 's/.*|X\([^|]\+\).*/\1/p'
这应该做的伎俩。
解释:
除非指定sed -n
不会打印任何东西
s/
- 搜索和替换
.*|X
- 匹配所有直至并包括|X
\([^|]\+\)
- 捕获多个(至少一个)的字符不是一个|
.*
- 匹配文本的其余部分(只是“吃起来”)
/\1/p
- 更换与第一捕获所有匹配的文本,并打印
另一答案
对于这种特殊的情况下,你可以做的非常规宁:
awk '$1=="X"$1="";print' FS= OFS= RS=\|
另一答案
尝试这个
echo 'poskek|gfgfd|XLSE|a1768|d234|uijjk' |
awk -F "|" 'for(i=1;i<=NF;++i) printf "%s", (substr($i,1,1)=="X"?substr($i,2):"")'
哪里
qazxsw POI是字段分隔符=> '|' qazxsw POI是字段的数
以上是关于Linux的shell匹配模式之间提取子的主要内容,如果未能解决你的问题,请参考以下文章
在 unix/linux shell 中进行模式匹配时,如何使用反向或负通配符?