我需要提取字符“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模式解释:
's/pattern/replace_string/'
- 替换模式。查找pattern
并将其替换为replace_string
\([0-9]*\.\)\{3,3\}
- 找到\([0-9]*\.\)\
重复3次的模式(\{3,3\})
\([0-9]*\.\)\
将对应0.
, 12.
,2345345345.
和.