, как заменить Выражение sed (изменить и распечатать только соответствующую строку) с выражением perl?

/usr/lib/dracut/skipcpio $your-initrd-img | zcat | cpio -id --no-absolute-file-names

или еще

/usr/lib/dracut/skipcpio $your-img | gunzip -c | cpio -id

(во FreeBSD нет опции --no-absolute-file-names для cpio)

Эта небольшая программа skipcpio , если она является частью пакета dracut. Но вы можете скачать код (skipcpio.c) и скомпилировать его даже под FreeBSD.

Это необходимо при извлечении образов initrd, созданных dracut, по крайней мере, в дистрибутивах на базе RedHat, таких как Fedora. Он помещает в образ файл с именем "early_cpio", поэтому извлечение initramfs обычным способом, известным ранее, не сработает.

2
13.04.2017, 15:36
2 ответа

Используйте форму модификатора if:

perl -ne 's/stuff/changed/, print if /patternmatch/'

or, вы можете использовать and и or для управления потоком:

perl -ne '/patternmatch/ and s/stuff/changed/, print'
9
29.04.2021, 00:26

's / abc / xyz /'

user@unix:~$ echo 'abc' | sed      's/abc/xyz/'
xyz   

user@unix:~$ echo 'abc' | perl -pe 's/abc/xyz/'
xyz

user@unix:~$ echo 'abc' > file.txt && cat file.txt
abc

user@unix:~$ sed      's/abc/xyz/' file.txt
xyz   

user@unix:~$ perl -pe 's/abc/xyz/' file.txt
xyz

's / patternmatch / stuffchanged /'

user@unix:~$ echo 'patternmatch' | sed      's/patternmatch/stuffchanged/'
stuffchanged   

user@unix:~$ echo 'patternmatch' | perl -pe 's/patternmatch/stuffchanged/'
stuffchanged

user@unix:~$ echo 'patternmatch' > file.txt && cat file.txt
patternmatch

user@unix:~$ sed      's/patternmatch/stuffchanged/' file.txt
stuffchanged   

user@unix:~$ perl -pe 's/patternmatch/stuffchanged/' file.txt
stuffchanged
1
29.04.2021, 00:26

Теги

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