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 .txt
fichier?
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 .txt
fichier?
command-line
text-processing
MsWanie
la source
la source
Réponses:
Il y a plusieurs moyens de le faire. Si votre fichier a une structure connue, vous pouvez l'utiliser
grep
. Lagrep
commande recherche dans un fichier une phrase spécifique et renvoie des lignes qui correspondent à cette phrase. Donc, si votre fichier ressemblevous pouvez courir
grep Name info.txt
et il reviendraName: Sally
. Vous pouvez ensuite rediriger la sortie vers un autre fichier. Donc, appelergrep 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.
la source
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:
Sinon, vous devrez rechercher chaque ligne que vous souhaitez copier, en utilisant toujours grep, et les ajouter à new.txt en utilisant
>>
à la place de>
.la source
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.
la source
En supposant que le fichier d'entrée
details.txt
contient:vous pouvez sélectionner les lignes "nom" et "téléphone" par grep étendu et rediriger la sortie vers new.txt:
Cela produira new.txt avec:
Comment ça fonctionne:
Grep imprime uniquement les lignes correspondantes. Les
-E
options 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.la source
Le fichier que vous avez montré contient tous les détails sur une seule ligne:
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
grep
le-o
drapeau de. Cela imprime uniquement la partie correspondante, plutôt que la ligne entière.Si vous souhaitez inclure les parties
age :
etphone number :
, vous pouvez utiliser l'-e
indicateur pour spécifier plusieurs correspondances ou l'alternance.L'expression
[^ ]*
signifie n'importe quel nombre de caractères qui ne sont pas un espace, elle correspond donc aux caractères aprèsage :
l'espace suivant.Remplacez
file
par 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: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
-E
drapeau pour indiquergrep
d'utiliser l'expression régulière étendue. La syntaxe est(pattern1|pattern2)
- cela correspondpattern1
et / oupattern2
. 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.Si vous souhaitez omettre les parties
age :
etphone number:
, vous pouvez utiliser l'-P
indicateur pour demandergrep
d'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é:Si vous souhaitez formater le texte différemment, vous pouvez utiliser
sed
, par exemple:Cela dépend du fait de
age
venir avantphone 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: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
sed
commandes non couvertes par les explications précédentes-r
utiliser l'expression régulière étendue pour des commandes plus lisibles (GNUsed
comprend-E
avec la même signification)s/old/new/
remplacerold
parnew
(pattern)
enregistrepattern
pour référence plus tard, avec\1
ou\2
etc (correspondant à l'ordre de gauche à droite dans lequel les groupes de capture se produisent - notez que celased
ne 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.la source