Вы можете использовать следующий инструмент для извлечения и -повторной упаковки загрузочного образа Android
$ git clone https://github.com/cfig/Android_boot_image_editor.git
скопируйте файл boot.img в клонированный репозиторий git. Беги:
$./gradlew unpack
При первом запуске потребуется загрузить необходимые библиотеки из Интернета, наберитесь терпения. Вы можете получить содержимое в «build/unzip _boot/», вот так:
build/unzip_boot/
├── bootimg.json (boot image info)
├── kernel
├── second (2nd bootloader, if exists)
├── boot.img.avb.json (AVB only)
└── root
.*([pqt])\d+$
Соответствует любым символам, за которыми следуют p, q или t и одна или несколько цифр. Группа соответствия — это единственная буква, которая вас интересует.
Поскольку вы отметили вопрос тегами grep
и sed
, я предполагаю, что список строк выражается как один элемент на строку некоторого текстового ввода.
Тогда:
sed -n 's/^.*\([^[:digit:]]\)[[:digit:]]\{1,\}$/\1/p' < that-input
или (при условии, что GNU grep
или совместимый с perl -например, поддержка регулярных выражений):
grep -Po '\D(?=\d+$)' < that-input
будет выводить нецифровой символ -, который предшествует замыкающим цифрам в строках, которые заканчиваются цифрой, отличной от -, за которой следует 1 или более цифр.
Оба используют регулярные выражения для сопоставления, но sed
использует базовые регулярные выражения, а grep -P
использует Perl -как регулярные выражения.
Некоторые реализации sed
также поддерживают -P
, но не самые распространенные. Некоторые поддерживают -E
расширенные регулярные выражения, которые являются еще одним диалектом регулярных выражений.С теми:
sed -E -n 's/^.*([^[:digit:]])[[:digit:]]+$/\1/p' < that-input
Или вы можете просто использовать сам perl
:
perl -lne 'print $1 if /(\D)\d+$/' < that-input
(будьте осторожны perl
работает на уровне байта -по умолчанию, а не на уровне символов, см. параметр -C
, чтобы указать ему интерпретировать ввод как UTF -8 символов или -Mopen=locale
для декодирования/кодирования ввод/вывод в соответствии с кодировкой локали, такой как grep
/ sed
обычно делают ).
или pcregrep
, пример grep
реализации, поставляемой с libpcre (библиотекой, используемой GNUgrep -P
):
pcregrep -o1 '(\D)\d+$' < that-input
С простым башмаком
shopt -s extglob
for host in "${hosts[@]}"; do
tmp=${host%%+([[:digit:]])} # strip the trailing digits
echo "$host => ${tmp: -1}" # extract the last character
done
gswast03 => t
gkjbossp1 => p
frdwop04 => p
Или с сопоставлением регулярных выражений:
for host in "${hosts[@]}"; do
if [[ $host =~ ([^[:digit:]])[[:digit:]]+$ ]]; then
echo "$host => ${BASH_REMATCH[1]}"
fi
done
Это будет работать с использованием любого sed в любой оболочке на каждом компьютере UNIX:
$ sed 's/.*\([^0-9]\).*/\1/' file
t
p
q
Вышеописанное было выполнено с этим входным файлом:
$ cat file
gswast03
gkjbossp1
frdwoq04