Regex 使用正则表达式排除字符串的前3个字符

Regex 使用正则表达式排除字符串的前3个字符,regex,bash,sed,Regex,Bash,Sed,给定bash中的任何字符串,例如flaccid,我希望匹配字符串中的所有字符,但前3个字符除外(在这种情况下,我希望排除“fla”,只匹配“ccid”)。正则表达式还需要在sed中工作 我尝试过积极的look behind和以下正则表达式(以及其他各种不成功的表达式): ^.{3}+([a-z,a-z]+) sed-r的/(?您可以在表达式中使用捕获组,如^.{3}(.*)/^.{3}([a-zA-Z]+)并获取${BASH_REMATCH[1]}内容: #!/bin/bash text="fl

给定bash中的任何字符串,例如flaccid,我希望匹配字符串中的所有字符,但前3个字符除外(在这种情况下,我希望排除“fla”,只匹配“ccid”)。正则表达式还需要在sed中工作

我尝试过积极的look behind和以下正则表达式(以及其他各种不成功的表达式):

^.{3}+([a-z,a-z]+)

sed-r的/(?您可以在表达式中使用捕获组,如
^.{3}(.*)
/
^.{3}([a-zA-Z]+)
并获取
${BASH_REMATCH[1]}
内容:

#!/bin/bash
text="flaccid"
rx="^.{3}(.*)"
if [[ $text =~ $rx ]]; then
        echo ${BASH_REMATCH[1]};
fi

sed
中,您还应该使用捕获组/反向引用来获取所需内容。要仅保留前3个字符,您可以使用以下简单方法:

echo "flaccid" | sed 's/.\{3\}//'
请参阅。由于未使用
g
修饰符,因此
\{3\}
与任何3个字符完全匹配,并且仅从开头删除它们

现在,上述两种解决方案都将输出
ccid
,只返回前3个字符。

如果要从字符串中获取除前3个字符以外的所有字符,可以使用
cut

str="flaccid"
cut -c 4- <<< "$str"

这将从字符串中删除前3个字符。

使用sed,只需删除它们即可

echo string | sed 's/^...//g'

为什么没有人将最简单和可移植的解决方案命名为: shell“参数扩展”:

对于正则表达式(bash):

sed中的相同正则表达式:

$ echo "flaccid" | sed -E "s/$regex/\1/"
ccid
或sed(基本正则表达式):


你能给我们看一下上下文代码吗,即使正则表达式不起作用,也会有帮助。你想在
bash
中使用正则表达式吗(
[[[$str=~$regex]]
)或者在
sed
,或者使用其他工具?您的问题目前太模糊了。我目前正忙于让它与sed一起工作,很抱歉,我会编辑问题。好吧,您的问题听起来很模糊,您需要
fla
还是
ciid
来自
flacid
?请告知,以便我可以调整t他回答。请注意,在Bash中,您匹配
=~
并捕获您需要的内容。在
sed
中,您捕获您需要的内容并匹配您不需要的内容,然后使用对组的反向引用来保留您需要保留的内容。标题显示排除前3个字符…问题包含
所有字符**但**前3个
ccid
是预期的输出,我相信…很多问题可以这样做,迫使ppl包括样本输入和输出(在需要时能够删除它们)@Sundeep:好的,谢谢,我“同步”了这两个解决方案。啊哈,现在问题说在这种情况下我想排除“fla”,只匹配“ccid”,所以现在答案是正确的。像
{3}
这样的边界是POSIX正则表达式的一部分;它们不是Perl扩展。(在基本正则表达式中,需要像这样转义大括号:
\{3\}
,但是
{3}
在扩展正则表达式中有效。)@Wiktor Stribiżew我更新了问题,使其更加清晰-我想排除任何字符串的前3个字符,因此在我的示例字符串中,我想匹配
ccid
echo string | sed 's/^...//g'
str="flacid"
echo "${str#???}
$ str="flaccid"
$ regex='^.{3}(.*)$'
$ [[ $str =~ $regex ]] && echo "${BASH_REMATCH[1]}"
ccid
$ echo "flaccid" | sed -E "s/$regex/\1/"
ccid
$ echo "flaccid" | sed 's/^.\{3\}\(.*\)$/\1/'
ccid