4

Как заставить sed печатать только совпадающее выражение?

Я хочу переписать строки типа «Аккумулятор 0: зарядка 44%, зарядка» в «Аккумулятор: 44%». Я попробовал следующее:

sed -n '/\([0-9]*%\)/c Battery: \1'

Это не работает

Распространенное "решение" - использовать поиск, замену и сопоставление всей строки: sed -n 's/.*\([0-9]*%\).*/Battery: \1/p' Теперь. * Слишком жадные, а \1 - это только%.

Кроме того, я не хочу соответствовать больше, чем мне нужно.

2 ответа2

8
  • Сделайте регулярное выражение немного более конкретным.

    sed -n 's/.* \([0-9]*%\),.*/Battery: \1/p'
    
  • Выберите другой инструмент.

    perl -ne '/(\d+%)/ && print "Battery: $1\n";'
    

    (только для записи, foo && bar является сокращением для if (foo) { bar } .)

2

Возможно, вы могли бы использовать grep -o (важен -o) вместо требуемых значений и использовать их в вашем скрипте (?) Таким образом, вы можете использовать значение более креативным способом или, может быть, просто обернуться echo и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .