从字符串中提取子字符串

从字符串中提取子字符串

我需要提取字符“2.0.1”、“2.0.12”之前的字符。来自类似字符串 sgdgfhfh-ZZZZZZ-ZZZ-2.0.1.ZZZ,sgdgfhfh-ZZZZZZ-ZZZ-2.0.12.ZZ :

我在尝试:

#!/bin/bash
c=grep -o '[.0-9]*[0-9]' $1 
echo $c 

file$1是包含 的文本文件ZZZZZZ-ZZZ-2.0.1.ZZZ,给出错误:

line 2: -o: command not found

答案1

正如@Archemar 在他的评论中所说,你的命令

c=grep -o '[.0-9]*[0-9]' $1

grep根本不执行。要将变量设置为命令的输出,语法为:

c=$(grep -o '[.0-9]*[0-9]' $1)

$(command)将被该命令的输出替换。

现在为什么会收到如此奇怪的错误消息?因为在执行命令之前进行变量赋值是有效的。这意味着仅为此命令设置该变量。如果您不想永久设置或更改变量,这可能很有用。因此,您的行被解释为“变量c将被设置为字符串grep,然后命令-o应使用参数'[.0-9]*[0-9]'和执行$1,因此会搜索命令-o,但找不到。

答案2

除非grep你可以尝试使用sed

sed 's/\([0-9]*\.\)\{3,3\}.*$//'

输入来自 echo

echo "sgdgfhfh-ZZZZZZ-ZZZ-2.0.12.ZZ" | sed 's/\([0-9]*\.\)\{3,3\}.*$//' 

在 bash 脚本中

首先,创建一个文件:

nano script.sh

将以下代码添加到脚本中:

#!/bin/bash

echo "$1" | sed 's/\([0-9]*\.\)\{3,3\}.*$//'

保存并退出。添加执行权限:

chmod u+x script.sh

script.sh使用输入参数运行($1在脚本内)

./script.sh "sgdgfhfh-ZZZZZZ-ZZZ-2.0.12.ZZ"

输出将:

sgdgfhfh-ZZZZZZ-ZZZ-

sed模式解释

  1. 's/pattern/replace_string/'- 替换模式。查找pattern并将其替换为replace_string

  2. \([0-9]*\.\)\{3,3\}- 找到\([0-9]*\.\)\重复3次的模式(\{3,3\})

\([0-9]*\.\)\将对应0., 12.,2345345345..

相关内容