Comment copier sélectivement les détails d'un fichier et les coller dans un nouveau fichier?

11

J'ai un fichier contenant mes coordonnées personnelles (.txt). Comment puis-je via le terminal copier seulement quelques détails du fichier et les mettre dans un nouveau .txtfichier?

Par exemple, s'il s'agit du contenu du fichier:

name : farah age : 23 phone number : 0123 education : degree

comment puis-je copier uniquement l'âge et le numéro de téléphone et les exporter dans un nouveau .txtfichier?

MsWanie
la source
2
Cela dépend de ce que vous voulez copier dans le nouveau fichier. Voulez-vous que les premières lignes, les dernières, des lignes contenant une chaîne, ne contenant pas de chaîne, des lignes entre deux chaînes? Il existe des outils pour faire tout cela, mais nous devons savoir ce que vous souhaitez faire.
Arcege

Réponses:

7

Il y a plusieurs moyens de le faire. Si votre fichier a une structure connue, vous pouvez l'utiliser grep. La grepcommande recherche dans un fichier une phrase spécifique et renvoie des lignes qui correspondent à cette phrase. Donc, si votre fichier ressemble

Nom: Sally

Date de naissance: 7.31.76

Adresse: 1234, rue Main

SSN: 123-45-6789

vous pouvez courir grep Name info.txtet il reviendra Name: Sally. Vous pouvez ensuite rediriger la sortie vers un autre fichier. Donc, appeler

grep Name info.txt > info2.txt

affichera la ligne dans le nouveau fichier info2.txt. Si vous souhaitez ajouter de nouvelles lignes, vous pouvez le faire

grep Address info.txt >> info2.txt

sinon le fichier sera écrasé.

Vous pouvez également apprendre à utiliser un éditeur de texte en ligne de commande comme vim.

Kris Harper
la source
2

Vous pouvez utiliser grep pour rechercher une expression régulière dans details.txt et rediriger le résultat vers le nouveau fichier.

Si toutes les lignes que vous souhaitez copier ont quelque chose en commun, vous ne pouvez pas utiliser les autres lignes:

grep "string in common" details.txt > new.txt

Sinon, vous devrez rechercher chaque ligne que vous souhaitez copier, en utilisant toujours grep, et les ajouter à new.txt en utilisant >>à la place de >.

danjjl
la source
1

Il existe également des éditeurs qui fonctionnent dans le terminal, par exemple nano, vi et emacs.

Si vous utilisez une interface utilisateur graphique sur votre machine locale et un terminal sur une machine distante, vous pouvez également utiliser la souris pour copier et coller d'une fenêtre / onglet de terminal vers une seconde.

elmicha
la source
1

En supposant que le fichier d'entrée details.txtcontient:

name: farah
age: 23
phone number: 0123
education: degree

vous pouvez sélectionner les lignes "nom" et "téléphone" par grep étendu et rediriger la sortie vers new.txt:

grep -E "age:|phone number:" details.txt > new.txt

Cela produira new.txt avec:

age: 23
phone number: 0123

Comment ça fonctionne:

Grep imprime uniquement les lignes correspondantes. Les -Eoptions activées regexp étendue qui vous donne la possibilité d'utiliser |(alternative). N'oubliez pas de citer le motif entier, il |sera donc interprété par grep. Sinon, shell essaiera d'interpréter. Vous ne voulez pas ça ici.

Michał Šrajer
la source
1

Le fichier que vous avez montré contient tous les détails sur une seule ligne:

name : farah age : 23 phone number : 0123 education : degree

J'ai supposé que vous pouvez coder age :en dur, etc. dans la commande, mais le texte qui le suit variera et que les détails peuvent ne pas être dans l'ordre donné ou être contigus.

Vous pouvez extraire des parties de la ligne avec greple -odrapeau de. Cela imprime uniquement la partie correspondante, plutôt que la ligne entière.

Si vous souhaitez inclure les parties age :et phone number :, vous pouvez utiliser l' -eindicateur pour spécifier plusieurs correspondances ou l'alternance.

$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123

L'expression [^ ]*signifie n'importe quel nombre de caractères qui ne sont pas un espace, elle correspond donc aux caractères après age :l'espace suivant.

Remplacez filepar le nom du fichier contenant vos coordonnées. Vous pouvez écrire le nouveau fichier en redirigeant la sortie vers un nouveau fichier avec l' >opérateur, comme ceci:

grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile

Lorsque vous faites cela, vous ne verrez aucune sortie. Vous devez d'abord vérifier la sortie, puis ajouter la redirection.

Voici l'exemple avec alternance. Nous utilisons le -Edrapeau pour indiquer grepd'utiliser l'expression régulière étendue. La syntaxe est (pattern1|pattern2)- cela correspond pattern1et / ou pattern2. Si l'un est trouvé, il sera imprimé (que l'autre soit trouvé ou non). J'utilise maintenant +au moins un des caractères précédents, au lieu de *zéro ou plusieurs du caractère précédent. Dans ce contexte, ils fonctionnent tous deux aussi bien.

$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23 
phone number : 0123 

Si vous souhaitez omettre les parties age :et phone number:, vous pouvez utiliser l' -Pindicateur pour demander grepd'utiliser des expressions régulières compatibles Perl. Cela prend en charge l'alternance et également un moyen de faire correspondre le texte après un modèle donné:

$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123

Si vous souhaitez formater le texte différemment, vous pouvez utiliser sed, par exemple:

$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123

Cela dépend du fait de agevenir avant phone number, alors ajustez en conséquence si ce n'est pas le cas. Si vous ne pouvez pas vous fier à la commande, vous pouvez utiliser cette commande très compliquée:

$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23

Cela réorganise la ligne afin que la phone number :section vienne en premier sur chaque ligne, puis effectue un deuxième remplacement pour sélectionner les détails souhaités. Je dois la technique utilisée ici à cette réponse de muru .

Notes sur les sedcommandes non couvertes par les explications précédentes

  • -rutiliser l'expression régulière étendue pour des commandes plus lisibles (GNU sedcomprend -Eavec la même signification)
  • s/old/new/remplacer oldparnew
  • (pattern)enregistre patternpour référence plus tard, avec \1ou \2etc (correspondant à l'ordre de gauche à droite dans lequel les groupes de capture se produisent - notez que cela sedne peut en contenir que 7!).
  • .n'importe quel caractère, .*représente donc un nombre quelconque de caractères.
  • ; sépare les commandes, comme dans le shell.
Zanna
la source