как извлечь один символ перед числом в строке

Вы можете использовать следующий инструмент для извлечения и -повторной упаковки загрузочного образа 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
0
24.07.2020, 13:57
4 ответа

.*([pqt])\d+$

Соответствует любым символам, за которыми следуют p, q или t и одна или несколько цифр. Группа соответствия — это единственная буква, которая вас интересует.

1
18.03.2021, 23:17

Поскольку вы отметили вопрос тегами 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
3
18.03.2021, 23:17

С простым башмаком

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
2
18.03.2021, 23:17

Это будет работать с использованием любого sed в любой оболочке на каждом компьютере UNIX:

$ sed 's/.*\([^0-9]\).*/\1/' file
t
p
q

Вышеописанное было выполнено с этим входным файлом:

$ cat file
gswast03
gkjbossp1
frdwoq04
0
18.03.2021, 23:17

Теги

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