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 中进行模式匹配时,如何使用反向或负通配符?

perl模糊匹配文件名

模式 ( regex ) 和找到的值之间的相似性

Linux shell文本过滤

Linux Gvim shell case...esac语句

linux shell 检查是不是是root用户