Вы можете проверить слова, которые появляются в обеих строках:
$ comm -12 <(sed 's/ /\n/g' <<<$str1 | sort) <(sed 's/ /\n/g' <<<$str2 | sort )
30
alanine
Команда comm
сравнивает файлы. С флагами -1
и -2
он будет печатать те строки, которые находятся в обоих файлах.
sed 's / / \ n / g' : это просто заменяет все пробелы на новые строки в
$ str1
, выводит на стандартный вывод, который затем передается через sort
, потому что comm
нуждается в своих входных файлах быть отсортированным. Подробнее о формате см. Bash: Here Strings .
Формат называется подстановкой процесса, подробнее об этом здесь .
Конечным результатом приведенной выше команды будет список всех слов, которые встречаются в обеих строках.
Если имя устройства заканчивается цифрой, то ядро добавляет символ 'p', чтобы отделить номер раздела от имени устройства.
/dev/sda -> /dev/sda1
/dev/mmcblk0 -> /dev/mmcblk0p1
Подробнее см. disk_name
функция в исходных кодах ядра Linux (linux/block/partition -generic.c):
if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno);
else
snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno)
Вот что может быть полезно или не полезно в этом стремлении:
# Try to figure out if partition names are separated by "p" from the device name or not.
# The following cases imply a "p"
# - If the device name starts with mmcblk (common drivers for SD card readers)
# - If there is no device/type file for the respective device in /sys/class/block (e.g., NVME drives)
# - If the respective device/type indicates "0" (hard disks)
base_dev=$(basename "$sd_dev")
if [[ "$base_dev" =~ mmcblk[0-9]+ || \
! -e "/sys/class/block/${base_dev}/device/type" || \
$(cat "/sys/class/block/${base_dev}/device/type") != 0 \
]]; then
part_sep="p"
else
part_sep=""
fi