我有以下内容。
oid=.1.3.6.1.4.1.795.2.5.0.xxx (these 0.xxx represent any random numeral)
我想做以下事情
echo $oid | sed (some commands to remove 0.xxx)
并存储结果字符串
.1.3.6.1.4.1.795.2.5
在 oid。
我不介意使用 Grep、awk 或 sed 等工具来完成此操作。0.xxx
之前的所有内容都可以更改,只有静态内容将为 0。
感谢您的帮助!
答案1
使用 bash 的参数扩展:
oid=".1.3.6.1.4.1.795.2.5.0.xxx"
oid="${oid%.0.*}"
echo "$oid"
输出:
.1.3.6.1.4.1.795.2.5
答案2
正如您所说,这是一种通用形式,您想要从文本(.0.xxx)中删除最后 6 个字符,因此您可以使用以下命令:
echo ".1.3.6.1.4.1.795.2.5.0.xxx" |sed 's/.\{6\}$//'
然后如果你想使用变量:
oid=.1.3.6.1.4.1.795.2.5.0.xxx
然后:
echo $oid | sed 's/.\{6\}$//'
输出为:
.1.3.6.1.4.1.795.2.5
另一种解决方案
echo "${oid:0:${#oid}-6}"
另一种解决方案是使用 cut 和 '.' 作为分隔符
echo $oid | cut -d '.' -f -10
答案3
使用sed
:
oid="$(echo -n .1.3.6.1.4.1.795.2.5.0.0 | sed -r 's/\.0\.[0-9]+$//')"
-r
:sed
解释ERE
(扩展正则表达式)模式
sed
命令分解:
s
:断言执行替换/
:开始模式\.
: 匹配一个.
字符0
: 匹配一个0
字符\.
: 匹配一个.
字符[0-9]+
:匹配 1 个或多个数字$
: 匹配行尾/
:停止模式/开始替换字符串/
:停止替换字符串/启动修饰符
答案4
使用grep
:
grep -Po '.*(?=\.0\.\d+$)'
测试 :
$ oid='.1.3.6.1.4.1.795.2.5.0.908'
$ oid="$(grep -Po '.*(?=\.0\.\d+$)' <<<"$oid")"
$ echo "$oid"
.1.3.6.1.4.1.795.2.5
grep -P
将使我们能够使用 PCREgrep -o
将仅输出匹配的部分.*(?=\.0\.\d+$)
将匹配 之前的所有字符.0
、 之后的所有字符.
以及末尾的任意数量的数字。