10

在 bash 脚本中,从字符串中提取文本模式的简单方法是什么?

例如,我想X在字符串末尾提取后跟 2 个数字?

4

5 回答 5

28

=~当您使用双方括号时,有一个漂亮的正则表达式运算符。捕获的组在$BASH_REMATCH阵列中可用。

if [[ $STRING =~ (X[0-9]{2})$ ]]; then
    echo "matched part is ${BASH_REMATCH[1]}"
fi
于 2012-07-18T01:30:28.357 回答
13

让我们将您的输入作为

输入.txt

ASD123
GHG11D3456
FFSD11dfGH
FF87SD54HJ

我想找到的模式是“SD[digit][digit]”

代码

grep -o 'SD[0-9][0-9]' Input.txt

输出

SD12
SD11
SD54

如果你想在脚本中使用它......那么你可以在变量/数组中分配上面的代码......这取决于你的需要。

于 2012-07-18T04:51:15.447 回答
7
$ foo="abcX23"
$ echo "$(echo "$foo" | sed 's/.*\(X[0-9][0-9]\)$/\1/')"
X23

或者

if [[ "$foo" =~ X[0-9][0-9]$ ]]; then
  echo "${foo:$((${#foo}-3))}"
fi
于 2012-07-18T01:28:03.300 回答
3

您还可以使用参数扩展:

V="abcX23"
PREFIX=${V%%X[0-9][0-9]} # abc
SUFFIX=${V:${#PREFIX}}   # X23
于 2012-07-18T01:34:37.020 回答
0

我需要从这个字符串中提取主机端口: NIC 1 Rule(0): name = guestsh, protocol = tcp, host ip = , host port = 2222, guest ip = , guest port = 22

该字符串是通过使用获得的: vboxmanage showvminfo Mojave | grep 'host port',我的意思是被过滤了,我需要提取主机端口中的任何数字;在这种情况下是 2222 但它可以不同。

于 2019-03-15T21:26:18.537 回答