web-dev-qa-db-fra.com

Remplacer la deuxième instance de chaîne dans une ligne d'un fichier ASCII à l'aide de Bash

J'ai un fichier ASCII avec la structure suivante:

file1.png otherfile1.png
file2.png otherfile2.png
file3.png otherfile3.png
...

Je veux remplacer .png par .mat, mais uniquement pour la deuxième colonne. Le résultat devrait être comme ceci:

file1.png otherfile1.mat
file2.png otherfile2.mat
file3.png otherfile3.mat
...

Comment je fais ça dans Bash?

5
mcExchange

Eh bien, si c'est la fin de la ligne ...

$ sed 's/\.png$/.mat/' file
file1.png otherfile1.mat
file2.png otherfile2.mat
file3.png otherfile3.mat
  • s/old/new/ rechercher et remplacer
  • \. point littéral (sans l'échappement, il ne correspond à aucun caractère)
  • $ fin de ligne

Ou pour spécifier explicitement la deuxième colonne, vous pouvez utiliser un chemin awk.

$ awk 'gsub(".png", ".mat", $2)' file
file1.png otherfile1.mat
file2.png otherfile2.mat
file3.png otherfile3.mat
  • gsub(old, new, where) rechercher et remplacer
  • $2 deuxième colonne
13
Zanna

Vous pouvez remplacer toutes les .png chaînes directement à la fin d'une ligne dans INPUTFILE comme ceci:

sed 's/\.png$/.mat/' INPUTFILE

La commande ci-dessus ne modifiera pas INPUTFILE mais imprimera uniquement la version modifiée sur le terminal.

Pour éditer directement le fichier en place, ajoutez l'indicateur -i à sed (ou -i.bak pour stocker une sauvegarde du fichier d'origine):

sed -i 's/\.png$/.mat/' INPUTFILE
7
Byte Commander