Bash проверяет, содержит ли строка только определенные символы

Возможно, модули звукового драйвера и/или демон PulseAudio не загружены, если (virtual? )звуковая карта отсутствовала во время установки Debian.

Используйте lspciили lsusbв зависимости от ситуации, чтобы убедиться, что звуковая карта видна на виртуальной машине. Затем просмотрите /proc/asoundдля получения информации о звуковых устройствах с функциональными драйверами и dmesgдля получения сообщений об ошибках, которые могли быть вызваны сбоем в автозагрузке звукового модуля.

Если у вас минимальная установка, вам может потребоваться запустить apt-get install pulseaudio, чтобы установить и запустить полный набор звуковых служб.


Согласно выходным данным cat /proc/asound/modules /proc/asound/cards /proc/asound/devices,у тебя должно быть:

  • /dev/snd/controlC0для управления аудиомикшером,
  • /dev/snd/pcmC0D0pи /dev/snd/pcmC0D1pдля аудиовыхода и
  • /dev/snd/pcmC0D0cдля аудиовхода.
  • Также должны быть /dev/snd/seqи /dev/snd/timerдля интерфейсов MIDI и таймера соответственно.

Если некоторые или все из них отсутствуют, это может быть проблемой с udev... но тогда ваше утверждение о том, что карта работает правильно, сбивает с толку :, если узлы устройства действительно отсутствуют, насколько я знаете, тогда не должно быть возможности передать звуковые данные драйверу. Вы уверены, что не работаете в среде с chroot, сеансом SSH с другим хостом или чем-то еще, что может показывать вам другое представление дерева каталогов /dev?

-4
16.04.2021, 07:59
5 ответов

Следующий скрипт принимает имя файла в качестве параметра и проверяет, состоят ли первая и последняя строки только из X символов

#!/bin/bash

echo First line
if [ "$(head -n 1 $1 | grep '^X\+$')" == "" ]; then
    #echo something else than X found in the first line
    echo no
else
    #echo only X found in the first line
    echo yes
fi

echo Last line
if [ "$(tail -n 1 $1 | grep '^X\+$')" == "" ]; then
    #echo something else than X found in the last line
    echo no
else
    #echo only X found in the last line
    echo yes
fi
0
28.04.2021, 22:52

Из-за заголовка («… если строка содержит только определенные символы» )Я предполагаю, что «только X» означает «только Xсимвол с », не строго "только один Xсимвол".

С sed. Позвольте мне начать с проверки последней строки, потому что она более общая :

.
sed -n -e '$ ! d' -e '/^X*$/ ino' -e '/^X*$/ ! iyes' -e '$ q'

Для проверки N --й строки замените $в первом и последнем выражениях на N. Например,. для N=5:

sed -n -e '5 ! d' -e '/^X*$/ ino' -e '/^X*$/ ! iyes' -e '5 q'

N=1 можно упростить, потому что в этом случае нам не нужно первое выражение, а последнее может быть простоq:

sed -n -e '/^X*$/ ino' -e '/^X*$/ ! iyes' -e q

Примечания:

  • Если нет N --й строки, то и вывода не будет.

  • Благодаряqsedвыходам при первой возможности (строки после N --го не обрабатываются ).

  • Вы можете использовать ^XX*$вместо ^X*$. Они будут генерировать разные выходные данные, если рассматриваемая строка окажется пустой. Чтобы проверить, является ли строка точно X, используйте ^X$.

  • В общем случае N появляется дважды и ^X*$появляется дважды. Это не DRY , но вы можете использовать переменные оболочки:

    N='$'
    pattern='^X*$'
    sed -n -e "$N ! d" -e "/$pattern/ ino" -e "/$pattern/ ! iyes" -e "$N q"
    
0
28.04.2021, 22:52

Так же, как и в моих предыдущих ответах на ваши вопросы(здесь и здесь):Удалить все остальные строки и заменить текущую строку строкой yesили noв зависимости от от того, содержит ли он какой-либо другой символ, кроме одиночногоX.

sed '1!d; s/^X$/no/; t; s/.*/yes/' file

Шаблон ^X$соответствует одиночному Xв строке, поэтому первая замена заменит всю строку строкой no, если в ней есть только один символ X. Команда tсама по себе пропускает остальную часть скрипта, если последняя команда s///внесла изменения.

Чтобы просмотреть последнюю строку, используйте $вместо 1в коде sed:

sed '$!d; s/^X$/no/; t; s/.*/yes/' file
0
28.04.2021, 22:52

С помощью AWKпроверка первой строки:

awk '{ print $0!="X"?"yes":"no"; exit }' infile

то же самое для проверки последней строки:

awk 'END{ print $0!="X"?"yes":"no" }' infile

и проверив N строку (, замените NвNR==Nномером строки -, который вы хотите проверить, это только Xили нет;NR==line#):

awk 'NR==N{ print $0!="X"?"yes":"no"; exit }' infile
0
28.04.2021, 22:52

Если вы хотите также рассмотреть строки, которые могут содержать символы NUL (или, в более общем случае, не -текст, который также включает последовательность байтов, не образующих допустимых символов, или строки длиннее LINE_MAX, или строки, не разделенные символом символ новой строки ), возможно, вам придется переключиться на zsh, так как другие оболочки не справляются с этим легко, а текстовые утилиты не гарантируют, что:

#! /bin/zsh -
if IFS= read -r line < file; then
  case $line in
    ("")     print -u2 empty;
    (*[^X]*) print -u2 does not contain only Xes;;
    (*)      print OK, only Xes;;
  esac
else
  print -u2 a full lines could not be read
fi

Или прибегнуть кperl:

perl -e '
  open FILE, "<", "file" or die "Cannot open: $!\n";;
  $_ = <FILE>;
  die "a line could not be read\n" unless defined $_;
  die "a full line could not be read\n" unless /\n$/;
  chomp;
  die "does not contain only Xes\n" if /[^X]/;
  print "OK, only Xes\n"'
0
28.04.2021, 22:52

Теги

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