web-dev-qa-db-fra.com

Editer un fichier texte pour ajouter de l'espace

J'ai un fichier texte qui ressemble à ceci

../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

Je souhaite ajouter un espace entre la dernière barre oblique et le nom du fichier de package deb, par exemple.

../pool/main/a/aalib/ libaa1_1.4p5-44build2_AMD64.deb

J'ai essayé d'utiliser sed mais je n'y suis pas parvenu.

3
harshit
sed 's_.*/_& _'

ssupprime tout jusqu'à la dernière barre oblique (.*/, les expressions rationnelles sont gourmandes) avec lui-même suivi d'un espace (&␣) dans chaque ligne.

Exemple d'exécution

À condition que votre fichier texte s'appelle file et réside dans le répertoire de travail actuel:

$ <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

Pour modifier le fichier en place, utilisez:

sed -i 's_.*/_& _' file
4
dessert

Ce qui peut être fait est d’utiliser le groupement de motifs et de tirer parti de la globbing gloutonne:

$ 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

Les parenthèses correspondent aux éléments \integer du modèle de remplacement. Ainsi, la première parenthèse fera correspondre goulûment tout à la dernière barre oblique et la seconde - tout après

Avec le fichier d'entrée dans la question:

$ 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...>
4

Et pour faire bonne mesure une version 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/ définir le séparateur de champ à /
  • pour chaque ligne d'entrée, tiré de /tmp/XXXX qui contient vos données
    • définir le séparateur de champ de sortie sur / ainsi
    • NF contient le nombre de champs, donc $NF est le dernier champ
    • Définissez le dernier champ comme étant une chaîne d'espace concaténée avec la valeur d'origine du dernier champ
    • et imprimer
1
jonathanjo