Как вырезать раздел с началом и концом, используя Bash? - PullRequest
2 голосов
/ 31 октября 2011

Когда я делаю pactl list, я получаю много информации.Из этой информации я пытаюсь начать только часть с Sink # 0 до конца этого раздела.

1) Информация

Sink #0
    State: SUSPENDED
    Name: auto_null
    Description: Dummy Output
    Driver: module-null-sink.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 14
    Mute: no
    Volume: 0:   0% 1:   0%
            0: -inf dB 1: -inf dB
            balance 0.00
    Base Volume: 100%
                 0.00 dB
    Monitor Source: auto_null.monitor
    Latency: 0 usec, configured 0 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Dummy Output"
        device.class = "abstract"
        device.icon_name = "audio-card"

Source #0
    State: SUSPENDED
    Name: auto_null.monitor
    Description: Monitor of Dummy Output
    Driver: module-null-sink.c
    Sample Specification: s16le 2ch 44100Hz
    Channel Map: front-left,front-right
    Owner Module: 14
    Mute: no
    Volume: 0:  80% 1:  80%
            0: -5.81 dB 1: -5.81 dB
            balance 0.00
    Base Volume: 100%
                 0.00 dB
    Monitor of Sink: auto_null
    Latency: 0 usec, configured 0 usec
    Flags: DECIBEL_VOLUME LATENCY 
    Properties:
        device.description = "Monitor of Dummy Output"
        device.class = "monitor"
        device.icon_name = "audio-input-microphone"

2) Я пытаюсь, например,:

#!/bin/bash
command=$(pactl list);
# just get Sink #0 section not one line 
Part1=$(grep "Sink #0" $command);
for i in $Part1
do
  # show only Sink #0 lines 
  echo $i;
done

3) Вывод очень странный

grep: dB: No such file or directory

Как я могу получить этот раздел, используя мой BASH-скрипт, есть ли другой лучший способ для работы с такой фильтрацией?

Продолжение : Так что я также старался сделать это простым.такие как:

pactl list | grep Volume | head -n1 | cut -d' ' -f2- | tr -d ' '
|________|   |________|    |______|   |_____________|  |_________|
  |            |                |              |           |
  command     target get    show 1 row      cut empty      Dont know..
  to list 

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

Вы можете использовать несколько функций редактора sed для достижения своей цели.

 sed -n '/^Sink/,/^$/p'  pactl_Output.txt

-n говорит: "не выполняйте стандартный вариант печати каждой строки вывода

/^Sink/,/^$/ - это регулярное выражение диапазона, которое говорит, что найдите строку, которая начинается с Sink, затем продолжайте смотреть на строки, пока не найдете пустую строку (/^$/).

последний символ, p говорит Печать того, что вы нашли.

Если в пустой строке есть пробелы или символы табуляции, используйте " ...,/^$[${spaceChar}${tabChar}]*\$/p". Обратите внимание на переход от одинарных кавычек к dbl-кавычкам, что позволит использовать переменные $ {spaceChar}$ {tabChar} должен быть расширен до их реальных значений. Вам может потребоваться экранировать закрывающий '$'. Вам нужно определить spaceChar и tabChar, прежде чем использовать их, например, spaceChar=" ". Здесь, на SO, вы не сможетесм. tabChar, но не все sed поддерживают версию * 1017. * Вы можете выбрать нажатие клавиши Tab или использовать \t. Я бы пошел с клавишей Tab, так как она более переносима.

Пока онаВероятно, можно выполнить ваш ходal с bash, sed был разработан для такого рода проблем.

Надеюсь, это поможет.

0 голосов
/ 31 октября 2011

Попробуйте:

Part1=`echo $command | grep "Sink #0"`

вместо

Part1=$(grep "Sink #0" $command);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...