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

问题描述 投票:0回答:5

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

我尝试过正向查找和以下正则表达式(以及其他各种不成功的表达式):

^.{3}+([a-z,A-Z]+)
sed -r 's/(?<=^....)(.[A-Z]*)/,/g'

Google 的帮助不是很大,因为它只产生“获取前 3 个字符..”之类的结果

提前致谢!

regex bash sed
5个回答
2
投票

如果你想从字符串中获取除了前3个之外的所有字符,你可以使用

cut
:

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

或 bash 变量替换:

str="flaccid"
echo "${str:3}"

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


1
投票

您可以在

^.{3}(.*)
/
^.{3}([a-zA-Z]+)
等表达式中使用捕获组并抓取
${BASH_REMATCH[1]}
内容:

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

参见 在线 Bash 演示

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

echo "flaccid" | sed 's/.\{3\}//'

请参阅此正则表达式演示

.\{3\}
完全匹配任何 3 个字符,并且只会从开头删除它们,因为未使用
g
修饰符。

现在,上述两种解决方案都会输出

ccid
,仅返回前3个字符。


0
投票

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

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

0
投票

怎么没有人说出最简单、最便携的解决方案: shell“参数扩展”:

str="flacid"
echo "${str#???}

对于正则表达式(bash):

$ str="flaccid"
$ regex='^.{3}(.*)$'
$ [[ $str =~ $regex ]] && echo "${BASH_REMATCH[1]}"
ccid

sed中的相同正则表达式:

$ echo "flaccid" | sed -E "s/$regex/\1/"
ccid

或 sed(基本正则表达式):

$ echo "flaccid" | sed 's/^.\{3\}\(.*\)$/\1/'
ccid

0
投票

我就是这样做的。测试并玩https://regex101.com/

这个正则表达式可以完成这项工作。

(?<=\w{3})[^\s]

© www.soinside.com 2019 - 2024. All rights reserved.