У меня есть следующее:
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. Спасибо за вашу помощь!
Как вы сказали, это общая форма, вы хотите удалить последние 6 символов из вашего текста (.0.xxx), чтобы вы могли использовать это:
echo ".1.3.6.1.4.1.795.2.5.0.xxx" |sed 's/.\{6\}$//'
Тогда, если вы хотите используйте [] d1]
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}"
[d5 ] Другое решение, использующее cut и '.' как делиметр echo $oid | cut -d '.' -f -10
Использование 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: [ ! d2] s: утверждает, что выполняет подстановку /: запускает шаблон \.: соответствует символу . 0: соответствует символу 0 \.: соответствует значению . ] [0-9]+: соответствует 1 или более цифрам $: соответствует концу строки /: останавливает шаблон / запускает заменяющую строку /: останавливает замену строки / запускает модификаторы
Использование awk
oid=".1.3.6.1.4.1.795.2.5.0.xxx"
awk -F'.' '{for (i=2;i<=NF-2;i++) {printf "%s","."$i} }' <<< "$oid"
или все в одном
awk -F'.' '{for (i=2;i<=NF-2;i++) {printf "%s","."$i} }' <<< ".1.3.6.1.4.1.795.2.5.0.xxx"
Выход
.1.3.6.1.4.1.795.2.5
Выход
NF-2 - все элементы без двух последних элементов
Использование 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 позволит нам использовать PCRE grep -o будет выводить только согласованную часть .*(?=\.0\.\d+$) будет соответствовать всем символам до .0, а затем . и любому количеству цифр в конце.