sed удалить последние 2 цифры

У меня есть следующее:

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
задан 15 June 2015 в 14:08

4 ответа

Как вы сказали, это общая форма, вы хотите удалить последние 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
4
ответ дан 23 May 2018 в 19:49

Использование 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 или более цифрам $: соответствует концу строки /: останавливает шаблон / запускает заменяющую строку /: останавливает замену строки / запускает модификаторы

4
ответ дан 23 May 2018 в 19:49

Использование 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 - все элементы без двух последних элементов

1
ответ дан 23 May 2018 в 19:49
  • 1
    Чтобы иметь новую строку, не сказав print "", вы всегда можете сказать printf "%s%s","."$i,(i<NF-2?OFS:ORS). Таким образом, после последнего элемента будет напечатан ORS (обычно новая строка). – fedorqui 15 June 2015 в 17:18

Использование 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, а затем . и любому количеству цифр в конце.
1
ответ дан 23 May 2018 в 19:49

Другие вопросы по тегам:

Похожие вопросы: