J'écris un script, je veux vérifier si la première ligne du fichier correspond à un certain modèle et si c'est le cas, imprimer le fichier. Comment puis-je atteindre cet objectif?
Comment vérifier le motif? Existe-t-il un moyen de vérifier le modèle et en fonction de la sortie, faites quelque chose ..
EDIT: veuillez jeter un oeil à cette question: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file
Je veux quelque chose comme ça, mais aucun d'eux n'a fonctionné pour moi. Je veux essentiellement vérifier si la première ligne correspond ou non à un motif d'expression régulière et en fonction de cela, imprimer les lignes de fichier.
Réponses:
Vous pouvez le faire avec
ed
:l'astuce ici est d'essayer de remplacer
PATTERN
en1st
ligne avec lui-même.ed
affichera une erreur s'il ne peut pas trouver le modèle spécifié, donc,p
(imprimer tout le fichier) ne sera exécuté qu'en cas de1s/PATTERN/&/
succès.Ou avec
sed
:cela se
q
produit si la première ligne ne correspond pas (!
)PATTERN
, sinon ellep
imprime toutes les lignes.Ou, comme l'a souligné Toby Speight , avec GNU
sed
:Q
est identiqueq
mais n'imprime pas l'espace de motif.la source
Q
au lieu deq
pour GNU sed, oud
avantq
(portable) afin de ne pas exiger le-n
drapeau et lap
commande:sed '1{/PATTERN/!Q}' infile
oused -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
, respectivement.d
redémarre le cycle de commande Cela me rattrape toujours! : - |sed
la premièresed
commande se plaintsed: -e expression #1, char 10: extra characters after command
(à cause dep
), mais lesed
dernièressed
suggestions fonctionnent bien.sed -n '1{/PATTERN/!q};p'
Avec coffre à outils POSIX:
la source
afficherait le nom des
txt
fichiers non cachés dans le répertoire actuel dont la première ligne correspond à l'expression régulière étenduepattern
avec lesawk
inplémentations qui le prennent en chargenextfile
.Si au lieu d'imprimer le nom du fichier, vous souhaitez imprimer tout le contenu du fichier, vous pouvez faire:
C'est efficace car il n'exécute qu'une seule commande, mais
awk
n'étant pas la commande la plus efficace pour vider le contenu d'un fichier, avec des fichiers volumineux, vous pouvez éventuellement obtenir de meilleures performances en faisant quelque chose comme:Autrement dit, utilisez uniquement
awk
pour imprimer la liste des fichiers qui correspondent (délimité par 0) et comptez surcat
pour vider leur contenu.la source
Si vous écrivez un script shell, vous pourriez donc quelque chose comme
Ou, en Perl:
la source
close ARGV
- être est-ce plus idiomatique que d'assigner$.
.Oldschool, traduisez simplement votre phrase en commandes standard:
Pour apprendre bash, c'est un bon début. Si vous avez juste besoin d'une solution rapide, essayez les réponses sed-, awk- ou perl. Les deux sont agréables, mais ce sont des langues que vous avez besoin (et que vous voulez probablement) apprendre.
C'est un exemple assez simple, donc si vous voulez en savoir plus, vous pouvez également essayer la même chose en ruby, php, js (par exemple dans nodejs) ou dans toute autre langue qui permet l'accès aux fichiers. Même C / C ++ ou Java devrait être facile à gérer avec une petite tâche.
la source
if/else
place de[ ] &&
.