Hay una manera de hacer esto, aunque no usa el comando rpm
. Deberá tener el binario rpm2cpio
disponible, y luego simplemente haga:
# cd /mnt/hard_disk
# rpm2cpio | cpio -idmv
Como mencionaste, tendrás que lidiar con los problemas de integridad de RPMDB después, pero eso hará que los archivos estén en su lugar. Existen numerosas páginas web con información y más detalles al respecto disponibles a través de una simple búsqueda en google, una de ellas eshttps://blog.packagecloud.io/eng/2015/10/13/inspect-extract-contents-rpm-packages/.
awk 'NR==FNR {pats[$1]++; next} $1 in pats {$2=$2"+"} 1' pats inp
11 hello+
22 wonderful
33 beach
44 today+
55 is+
66 great
Для проверки совпадения в любом месте каждой строки inp
, вы можете использовать аналогичный подход, но извлекая часть для сравнения с помощью match
awk 'NR==FNR {pats[$1]++; next} match($0,/[0-9]+/) && substr($0,RSTART,RLENGTH) in pats {$0=$0"+"} 1' pats inp2
11 hello+
wonderful22
beach 33 front
to44day+
is55+
gr 66 eat
(Если вы хотите сравнить с произвольными шаблонами из файла pats
, то потребуется другой подход, например, перебор элементов массива pats
в явном виде)
синтаксис bash:
sed -f <(printf 's/^%d\>.*/&+/\n' $(<pats)) inp
Часть внутри части <()
печатает программу sed для преобразования соответствующих строк:
$ printf 's/^%d\>.*/&+/\n' $(<pats)
s/^11\>.*/&+/
s/^44\>.*/&+/
s/^55\>.*/&+/
Синтаксис <()
- это подстановка процесса bash, так что вы можете взять вывод команды и работать с ним, как с файлом.
Затем у нас есть sed -f sed_program inp
для фактического преобразования файла