给定 bash 中的任何字符串,例如 flaccid,我想匹配字符串中除前 3 个字符之外的所有字符(在这种情况下,我想排除“fla”并仅匹配“ccid”)。正则表达式也需要在 sed 中工作。
我尝试过正向查找和以下正则表达式(以及其他各种不成功的表达式):
^.{3}+([a-z,A-Z]+)
sed -r 's/(?<=^....)(.[A-Z]*)/,/g'
Google 的帮助不是很大,因为它只产生“获取前 3 个字符..”之类的结果
提前致谢!
如果你想从字符串中获取除了前3个之外的所有字符,你可以使用
cut
:
str="flaccid"
cut -c 4- <<< "$str"
或 bash 变量替换:
str="flaccid"
echo "${str:3}"
这将从字符串中删除前 3 个字符。
您可以在
^.{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个字符。
使用 sed,只需删除它们即可
echo string | sed 's/^...//g'
怎么没有人说出最简单、最便携的解决方案: 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