Изменить текстовый файл, чтобы добавить пространство
У меня есть текстовый файл, который выглядит так
../pool/main/a/aalib/libaa1_1.4p5-44build2_amd64.deb
../pool/main/a/accountsservice/accountsservice_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/accountsservice/gir1.2-accountsservice-1.0_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/accountsservice/libaccountsservice0_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/acl/acl_2.2.52-3build1_amd64.deb
../pool/main/a/acl/libacl1_2.2.52-3build1_amd64.deb
../pool/main/a/acl/libacl1-dev_2.2.52-3build1_amd64.deb
../pool/main/a/acpid/acpid_2.0.28-1ubuntu1_amd64.deb
../pool/main/a/acpi-support/acpi-support_0.142_amd64.deb
../pool/main/a/adduser/adduser_3.116ubuntu1_all.deb
../pool/main/a/adium-theme-ubuntu/adium-theme-ubuntu_0.3.4-0ubuntu4_all.deb
../pool/main/a/advancecomp/advancecomp_2.1-1_amd64.deb
../pool/main/a/adwaita-icon-theme/adwaita-icon-theme_3.28.0-1ubuntu1_all.deb
../pool/main/a/aisleriot/aisleriot_3.22.5-1_amd64.deb
../pool/main/a/alabaster/python3-alabaster_0.7.8-1_all.deb
../pool/main/a/alembic/alembic_0.9.3-2ubuntu1_all.deb
../pool/main/a/alembic/python3-alembic_0.9.3-2ubuntu1_all.deb
../pool/main/a/alembic/python-alembic_0.9.3-2ubuntu1_all.deb
../pool/main/a/alsa-driver/alsa-base_1.0.25+dfsg-0ubuntu5_all.deb
../pool/main/a/alsa-driver/linux-sound-base_1.0.25+dfsg-0ubuntu5_all.deb
Я хочу добавить пробел между последней косой чертой и именем файла пакета deb, например
../pool/main/a/aalib/ libaa1_1.4p5-44build2_amd64.deb
Я пытался использовать sed, но не смог сделать это правильно.
3 ответа
sed 's_.*/_& _'
sубивает все до последнего слеша (.*/, регулярные выражения являются жадными) с самим собой, а затем пробел (&␣) в каждой строке.
Пример запуска
Если ваш текстовый файл называется file и находится в текущем рабочем каталоге:
$ <file sed 's_.*/_& _'
../pool/main/a/aalib/ libaa1_1.4p5-44build2_amd64.deb
../pool/main/a/accountsservice/ accountsservice_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/accountsservice/ gir1.2-accountsservice-1.0_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/accountsservice/ libaccountsservice0_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/acl/ acl_2.2.52-3build1_amd64.deb
../pool/main/a/acl/ libacl1_2.2.52-3build1_amd64.deb
../pool/main/a/acl/ libacl1-dev_2.2.52-3build1_amd64.deb
../pool/main/a/acpid/ acpid_2.0.28-1ubuntu1_amd64.deb
../pool/main/a/acpi-support/ acpi-support_0.142_amd64.deb
../pool/main/a/adduser/ adduser_3.116ubuntu1_all.deb
../pool/main/a/adium-theme-ubuntu/ adium-theme-ubuntu_0.3.4-0ubuntu4_all.deb
../pool/main/a/advancecomp/ advancecomp_2.1-1_amd64.deb
../pool/main/a/adwaita-icon-theme/ adwaita-icon-theme_3.28.0-1ubuntu1_all.deb
../pool/main/a/aisleriot/ aisleriot_3.22.5-1_amd64.deb
../pool/main/a/alabaster/ python3-alabaster_0.7.8-1_all.deb
../pool/main/a/alembic/ alembic_0.9.3-2ubuntu1_all.deb
../pool/main/a/alembic/ python3-alembic_0.9.3-2ubuntu1_all.deb
../pool/main/a/alembic/ python-alembic_0.9.3-2ubuntu1_all.deb
../pool/main/a/alsa-driver/ alsa-base_1.0.25+dfsg-0ubuntu5_all.deb
../pool/main/a/alsa-driver/ linux-sound-base_1.0.25+dfsg-0ubuntu5_all.deb
Чтобы изменить файл на месте, используйте:
sed -i 's_.*/_& _' file
Что можно сделать, это использовать группировку шаблонов и воспользоваться преимуществами жадного сглаживания:
$ echo '../pool/main/a/aalib/libaa1_1.4p5-44build2_amd64.deb' |
> sed -r 's/(^.*\/)(.*\.deb)/\1 \2/'
../pool/main/a/aalib/ libaa1_1.4p5-44build2_amd64.deb
Скобки соответствуют \integer элементы в шаблоне замены. Таким образом, первая скобка будет жадно соответствовать всему последнему слешу, а вторая - всему, что после этого
С входным файлом в вопросе:
$ sed -r 's/(^.*\/)(.*\.deb)/\1 \2/' pool.txt
../pool/main/a/aalib/ libaa1_1.4p5-44build2_amd64.deb
../pool/main/a/accountsservice/ accountsservice_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/accountsservice/ gir1.2-accountsservice-1.0_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/accountsservice/ libaccountsservice0_0.6.45-1ubuntu1_amd64.deb
../pool/main/a/acl/ acl_2.2.52-3build1_amd64.deb
../pool/main/a/acl/ libacl1_2.2.52-3build1_amd64.deb
<...and so on and so forth...>
И для хорошей меры, версия awk
$ awk -F/ '{ OFS="/"; $NF=" "$NF; print; }' /tmp/XXXX
[...]
../pool/main/a/acl/ libacl1_2.2.52-3build1_amd64.deb
../pool/main/a/acl/ libacl1-dev_2.2.52-3build1_amd64.deb
[...]
-F/установите разделитель полей на/- для каждой строки ввода, взятой из
/tmp/XXXXкоторый содержит ваши данные- установить разделитель выходного поля в
/также NFсодержит количество полей, так$NFпоследнее поле- Установите последнее поле как строку пробела, соединенную с исходным значением последнего поля
- и распечатать
- установить разделитель выходного поля в