2017-10-10 21 views
-1

J'essaie de faire ceci:remplacer une lettre à une position spécifique dans le fichier lui-même en utilisant bash

J'ai un fichier avec le contenu comme ci-dessous;

fichier

: abcdefgh

Je cherche une façon de le faire;

fichier

: un BC DEFGH

Alors, faites la 2e et 3e lettre "capitale/majuscule" dans le fichier lui-même, parce que je dois faire plusieurs conversions à différentes positions dans une chaîne dans le fichier. Quelqu'un peut-il m'aider s'il vous plaît à savoir comment faire cela?

Je suis venu à connaître quelque chose comme ceci ci-dessous, mais il ne fait que pour un seul premier caractère de la chaîne dans le fichier:

sed -i 's/^./\U&/' file 

sortie: Abcdefgh

Merci beaucoup!

Répondre

1

Changer votre sed approche à ce qui suit:

sed -i 's/\(.\)\(..\)/\1\U\2/' file 

$ cat file 
aBCdefgh 

correspondant à la section:

  • \(.\) - match le 1er caractère de la chaîne dans le 1er groupe capturé

  • \(..\) - match les 2 prochains caractères placer dans le 2ème groupe capturé

section de remplacement:

  • \1 - indique le 1er groupe parenthèse \1-à-dire le 1er car

  • \U\2 - majuscules les caractères du 2e groupe capturé \2


Bonus approche pour Je veux tirer parti des caractères "105e & 106e":

sed -Ei 's/(.{104})(..)/\1\U\2/' file 
+0

'^' est redondant, la première correspondance commence à gauche et '.' correspond toujours au premier caractère – 123

+0

Merci! Pouvez-vous s'il vous plaît m'aider à comprendre la commande? :-). Par exemple; Je ne comprends pas comment seuls "bc" ont été capitalisés. – Dipak

+0

@Dipak, voir mon explication – RomanPerekhrest

1

awk de service.

echo "abcdefgh" | awk '{print substr($0,1,1) toupper(substr($0,2,2)) substr($0,4)}' 

La sortie sera la suivante.

aBCdefgh 

Si vous avez un INPUT_FILE et que vous souhaitez enregistrer les modifications en même INPUT_FILE.

awk '{print substr($0,1,1) toupper(substr($0,2,2)) substr($0,4)}' Input_file > temp_file && mv temp_file Input_file 

Explication: S'il vous plaît passer au-dessus du code comme ceci est uniquement à des fins d'explication.

echo "abcdefgh" ##using echo command to print a string on the standard output. 
|    ##Pipe(|) is used for taking a command's standard output to pass as a standard input to another command(in this case echo is passing it's standard output to awk). 
awk '{   ##Starting awk here. 
       ##Print command in awk is being used to print anything variable, string etc etc. 
       ##substring is awk's in-built utility which will allow us to get the specific parts of the line, variable. So it's syntax is substr(line/variable,starting point of the line/number,number of characters you need from the strating point mentioned), in case you haven't mentioned any number of characters it will take all the characters from starting point to till the end of the line. 
       ##toupper, so it is also a awk's in-built utility which will covert any text to UPPER CASE passed to it, so in this case I am passing 2nd and 3rd character to it as per OP's request. 
print substr($0,1,1) toupper(substr($0,2,2)) substr($0,4)}' 
+1

Courte et concis. J'aime ça! –

+0

@MatiasBarrios, vous êtes les bienvenus. Merci pour vos encouragements. – RavinderSingh13

+0

Merci! pouvez-vous s'il vous plaît m'aider à comprendre ce que la commande est en train de faire? – Dipak