Получить числа, сопоставляющие шаблон от выхода LS ?

Вы используете стандартное ядро ​​debian или ac? Скомпилированное на заказ ядро? Если в наличии, то для вашего пакета linux-image- * должен быть соответствующий пакет linux-headers- *.

В Debian также есть виртуальные пакеты с именами linux-image- $ arch и linux-headers- $ arch (например, где $ arch равно amd64] или 586 или 686-pae и т. Д.), Которые зависят от самых последних доступных пакетов ядра, поэтому, если ваша система amd64 , то

apt- get install linux-image-amd64 linux-headers-amd64

установит самый последний образ ядра и заголовки для вашей версии debian.

То же самое верно, если вы используете ядра из репозитория Liquorix , но виртуальные пакеты имеют несколько другие имена:

apt-get install linux-image-liquorix-amd64 linux-headers- ликориксamd64

Обратите внимание, что для сетевых карт realtek вам, вероятно, также потребуется установить микропрограмму realtek из раздела non-free архивов debian. Убедитесь, что non-free находится в вашем /etc/apt/sources.list , и запустите

apt-get install firmware-realtek

Наконец, для компиляции модулей вам, вероятно, также понадобится dkms или хотя бы установлен пакет build-essential .

5
17.07.2018, 15:19
4 ответа

Анализ вывода ls— плохая идея. (вывод lsпредназначен исключительно для просмотра ). Для получения дополнительной информации см. вопрос «Почему *не *parse `ls `? ».

Вот как это можно сделать в соответствии с/bin/sh:

for filename in t-*-*.c; do
    [ ! -f "$filename" ] && continue
    number=${filename#t-}   # remove "t-" from start of filename
    number=${number%%-*}    # remove everything from first "-" in what remains
    printf '%s\n' "$number"
done

Это будет перебирать все имена файлов в текущем каталоге, имя которых соответствует шаблону t-*-*.c. Для каждого из этих имен с самого начала убирается бит t-, а затем второй -и все последующее удаляется с другим расширением параметра.

Расширение ${variable#word}удалит (кратчайшее )соответствие для wordиз начало из $variable, а ${variable%%word}удалит (самое длинное )] соответствует wordот конца строки.

С bash, используя сопоставление регулярных выражений в именах файлов:

for filename in t-*-*.c; do
    [ ! -f "$filename" ] && continue
    if [[ "$filename" =~ ^t-([0-9]+)- ]]; then
        printf '%s\n' "${BASH_REMATCH[1]}"
    fi
done

Это сопоставит и захватит цифры после t-в каждом имени файла. Захваченная группа цифр доступна в ${BASH_REMATCH[1]}после успешного сопоставления. Индекс 1относится к первой группе захвата (в скобках )в регулярном выражении.

Для медленного, но, возможно, удобного (как в "знакомом" )решении, вы можете вызвать внешнюю команду для разбора интересующего вас бита строки:

for filename in t-*-*.c; do
    [ ! -f "$filename" ] && continue
    cut -d '-' -f 2 <<<"$filename"
done

Это предполагает bashи что вы можете вызывать cutв цикле. Это было бы намного медленнее, чем использование операции, встроенной в саму оболочку. Команде cutздесь предлагается вернуть второе--поле с разделителями из строки, переданной ей изbash(с использованием перенаправления «здесь -строка» ).

3
27.01.2020, 20:34

Согласно вашему выводу:

ls|awk -F"-" '{print $2}'

Должно работать,но если вы хотите принять во внимание часть t-, то

ls|grep ^t-|awk -F"-" '{print $2}'

или

ls|awk -F"t-" '{print $2}'|awk -F"-" '{print $1}'

3
27.01.2020, 20:34

Когда я создал список файлов из вашего примера, мой lsсортирует их таким образом:

$ ls -1
myFile.c
mySecondFile.c
t-1-myFirstTest.c
t-21-tset241.c
t-3-test1234.c
t-42-my_second_test.c

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

I want to delete everything of this text except the newlines and the numbers between t- and the second -

Я интерпретировал это как означающее, что имена файлов, которые не соответствуют t-, должны быть «удалены, за исключением новой строки», что означает, что :выводит пустую строку для этих имен файлов, но в противном случае выводит числа между тире.

lsnums ()
{
    for f in *
    do
        if [[ "$f" =~ t-([[:digit:]]+)- ]]; then
            printf '%s\n' "${BASH_REMATCH[1]}"
        else
            echo
        fi
    done
}

В результате получается:

$ lsnums


1
21
3
42

... где две пустые строки соответствуют файлам первого типа, начинающимся с myвместо t-.

3
27.01.2020, 20:34

Это можно просто сделать с помощью:

ls | cut -d '-' -f 2
1
27.01.2020, 20:34

Теги

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