remplacer une chaîne de la première ligne sur plusieurs fichiers

J’ai reçu 10 000 fichiers texte que je dois modifier.

La première ligne de chaque fichier contient une URL.

Par erreur pour quelques fichiers, l’URL manque de “com”

eg: 1) http://www.supersonic./psychology 2) http://www.supersonic./social 3) http://www.supersonic.com/science 

ma tâche est de vérifier et d’append “com” s’il manque

 eg: 1) http://www.supersonic.com/psychology 2) http://www.supersonic.com/social 3) http://www.supersonic.com/science 

toutes les URL sont du même domaine (supersonic.com)

pouvez-vous me suggérer une approche rapide et facile?

J’ai essayé ceci: remplacer supersonic./ avec supersonic.com

 sed -e '1s/supersonic.//supersonic.com/' * 

pas de changement dans la sortie.

Vous êtes très proche de votre code, mais vous devez tenir compte du caractère / après le . carboniser.

En supposant que vous utilisez un sed moderne avec l’option -i (modification in-situ), vous pouvez le faire

 sed -i '1s@supersonic\./@supersonic.com/@' * 

Notez que plutôt que d’échapper à / intérieur de s/srchpat\/withSlash/replaceStr/' , vous pouvez utiliser un autre caractère après la commande the s comme délimiteur, ici j’utilise s@...@...@ . Si votre modèle de recherche avait un caractère @ , vous devrez utiliser un caractère différent.

Certaines anciennes versions de sed besoin de vous pour échapper au délimiteur alternatif à la première utilisation, donc

  sed 's\@srchStr@ReplStr@' file 

pour ces cas.

Si vous utilisez un sed qui ne supporte pas les options -i , vous devrez alors boucler votre fichier et gérer les fichiers tmp, c.-à-d.

  for f in *.html ; do sed '1s@supersonic\./@supersonic.com/@' "$f" > /tmp/"$f".fix \ && /bin/mv /tmp/"$f".fix "$f" done 

Attention

Mais comme vous parlez de 10 000 fichiers, vous voudrez faire des tests avant d’utiliser l’une de ces solutions. Copiez un bon ensemble aléatoire de ces fichiers dans / tmp / mySedTest / dir et exécutez l’une de ces solutions pour vous assurer qu’il n’y a pas de sursockets.

Et vous êtes susceptible de faire sauter la ligne de commande MAX_SIZE avec plus de 10 000 fichiers, alors lisez à propos de find et xargs. Il y a beaucoup de messages ici à propos de [sed] find xargs . Vérifiez-les si nécessaire.

IHTH

  1. Utilisez -i pour changer les fichiers au lieu de simplement afficher les lignes modifiées.

  2. Utilisez un délimiteur différent de / si vous souhaitez utiliser / dans le regex (ou utilisez \/ dans le regex).

  3. Utilisez \. faire correspondre un point littéralement,. correspond à n’importe quoi.

     sed -i~ -e '1s=supersonic\./=supersonic.com/=' * 

Certaines versions de sed ne supportent pas -i .