sed выбирает последний случай вместо первого - PullRequest
1 голос
/ 21 октября 2019

Я хочу выбрать только первое вхождение шаблона в строке, например, '53 .0 ', вместо этого я получаю:

$ echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" |
  sed -n 's/.*+\([0-9.]*\).*/\1/p'

, который для меня печатает: 100.0, когда я ожидал: 53.0.

Я использую Ubuntu 18.04.3 LTS.

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Не могли бы вы попробовать следующее.

echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" | 
sed 's/[^+]*+\([^ ]*\).*/\1/'

ИЛИ, если вы не хотите выводить °, попробуйте следующее.

echo  "Core 0: +53.0°C (high = +80.0°C, crit = +100.0°C)" |  
sed 's/[^+]*+\([^°]*\).*/\1/'

Объяснение приведенного выше кода:

Я использовал sed возможность сохранения сопоставленного регулярного выражения во временную буферную память и дал ему ссылку как \1, чтобы распечатать его позже.

Следующее объяснение предназначено только для объяснения целей использования кода выше кода, пожалуйста.

sed '          ##Starting sed program here.
s              ##Using s option for substitution method by sed on Lines of Input_file.
/[^+]*+        ##Using regex to have till 1st occurrence of + here.
\([^ ]*\)      ##Using memory buffer saving capability of sed to save matched regex in it.
               ##Have used regex to match everything till occurrence of space. Which should catch 1st temperature.
.*             ##Mentioning .* to match all rest line.
/\1/'          ##Now substituting whole line with 1st buffer matched value.

Объяснение, почему код OP не работает: Поскольку OPв своей попытке использует .*+, что соответствует ЖАДОМУ совпадению , поэтому оно соответствует последнему вхождению +, таким образом, оно дает последнее значение температуры.

Примечание: добавленоссылка предоставлена ​​Sundeep Sir в комментариях для понимания жадных матчей.

0 голосов
/ 21 октября 2019

Довольно просто сделать с awk (нет необходимости в сложном регулярном выражении)

echo  "Core 0: +53.1°C (high = +80.0°C, crit = +100.0°C)" | awk '{print $3+0}'
53.1

Напечатайте третье поле $3, затем +0 используется для получения только цифр, оно обрезается°C

...