Remplacement d'une chaîne contenant des espaces Linux

J'ai écrit un code qui ** réécrit la chaîne de caractères avec un script shell et remplit les parties manquantes avec des espaces **, donc je garderai un mémorandum de ce que j'ai vérifié et où j'ai trébuché.

Tâche

Contexte

Une histoire lors de la formation en langage C. Lors de l'écriture du code source, il était nécessaire de réécrire le commentaire d'en-tête à chaque fois. Par exemple

training1-1.c


/*###################################################*/
/*#           File      :  training1-1.c            #*/
/*#           Date      :  2019/10/22               #*/
/*###################################################*/

int main(void){
    printf("Hello World\n");
    return 0;
}

Comme, Kanji. Surtout pendant la formation, les noms de fichiers sont presque les mêmes que dans "training1-1.c", donc si vous répétez la création de fichiers → renommer le nom de fichier, il sera difficile de retaper à chaque fois.

Ce que vous voulez réaliser

  1. ** Modifiez automatiquement les commentaires d'en-tête et alignez le nombre d'espaces de commentaire de manière ordonnée **
  2. ** Si vous écrivez le code source avec vim et que vous le sauvegardez, il affichera le résultat de l'exécution tel quel **

Comme je faisais tout, de la création de fichiers à la compilation dans l'environnement Linux, j'ai essayé de le créer en utilisant la connaissance du script shell que j'étudiais juste.

Livrables

Le script shell (zikko.sh) ** qui édite, compile et exécute le commentaire d'en-tête ** créé cette fois sera utilisé avec le modèle sous-jacent (template.c). La méthode d'exécution et le contenu de zikko.sh et template.c sont les suivants. De plus, peut être avant l'extension.

.sh


#Méthode d'exécution
$ ./zikko.sh template <nom de fichier>

zikko.sh


#!/bin/bash

template=$1
newFile=$2
date=$(date "+%Y/%m%d")
convertSymbolFile=$"FILE_NAME"
convertSymbolDate=$"YYYY/MM/DD"

#Modifier le fichier d'en-tête si le fichier n'existe pas
if [ ! -e $newFile.c ]; then
    #Ajustez l'espace pour changer le titre du fichier
    if [ ${#newFile} -le ${#convertSymbolFile} ]; then
        diffOfStr=$((${#convertSymbolFile}-${#newFile}))
        numOfSpace=$(seq -s" " $((diffOfNum+1)) | tr -d '[:digit:]')
        newFileTitle=$newFile$numOfSpace
        sed -e "s:$convertSymbolFile:$newFileTitle:g" $template.c > $newFile.c
    #else
    #Longueur de la chaîne convertie> FILE_J'ai essayé d'écrire le traitement pour NAME, mais j'ai abandonné en raison de contraintes de temps
    #Je pense qu'il n'y a aucun problème si la chaîne de caractères de convertSymbolFile est allongée.
    fi
    #Date de modification
    sed -i -e "s:$convertSymbolDate:$date:g" $newFile.c
fi

#Commencez l'édition à partir de la ligne où la fonction principale est écrite
mainFuncLow=$(grep SOURCE_CODE -n $newFile.c | cut -d ":" -f 1)
vim -c $mainFuncLow $newFile.c

#Compiler et exécuter
gcc -o $newFile.x $newFile.c
./$newFile.x

template.c


/*###################################################*/
/*#           File      :  FILE_NAME                #*/
/*#           Date      :  YYYY/MM/DD               #*/
/*###################################################*/

int main(void){
    //SOURCE_CODE
    return 0;
}

Si vous ajoutez la chaîne de caractères avant la conversion au modèle et que vous jouez un peu avec le processus de modification du titre du fichier zikko.sh, vous devriez être en mesure de gérer l'ajout de simples commentaires d'en-tête ... J'ai l'impression que le code est long pour le travail qui semble simple. S'il vous plaît laissez-moi savoir s'il existe une meilleure façon.

Point de trébuchement

Répéter l'espace

Quand j'ai recherché "Remplacement de chaîne de caractères Linux, répéter", j'ai trouvé pas mal d'articles sur la répétition de symboles, mais je n'ai pas trouvé beaucoup d'articles qui inséraient des espaces à plusieurs reprises. La méthode la plus simple que j'ai trouvée était d'envoyer le résultat de la commande seq à la commande tr dans le pipeline [^ 1].

Point de trébuchement 1.sh


#diffOfNum=4

$ seq -s" " $((diffOfNum+1)) | tr -d '[:digit:]'
#->***** Au lieu d'espace*Afficher avec

Concaténation de chaînes

Afin de combiner des chaînes de caractères avec un script shell, il semble que les variables shell doivent être écrites consécutivement [^ 2].

Point de trébuchement 2.sh


#newFile=file1 ※<nom de fichier>
#numOfSpace=****

$ newFileTitle=$newFile$numOfSpace
#->file1****

Comment utiliser la commande sed

J'ai souvent utilisé la commande sed pour remplacer les chaînes, je vais donc noter brièvement comment l'utiliser et où j'ai trébuché. Tout d'abord, la méthode d'exécution est la suivante.

$ sed [option] <scénario> <nom de fichier>

Recommended Posts

Remplacement d'une chaîne contenant des espaces Linux
Remplacement en bloc des chaînes dans les tableaux Python
00. Ordre inverse des chaînes
Concaténation de cordes rubis
Signification des autorisations Linux
Ajout du swap Amazon Linux
Faire une sauvegarde incrémentielle de Linux (restauration)
Résumé des types de distribution Linux
Traduction japonaise du manuel Linux
Linux: remplacement DNS dans systemd.
Un bref résumé de Linux
Signification des autorisations de répertoire Linux