Que faire si l'option -f de grep ne fonctionne pas

introduction

Si vous utilisez grep -f et qu'il arrive que seule **" la ligne à la fin de la chaîne de recherche "soit frappée *** Le code de saut de ligne peut en être la cause. → Le contenu est que si vous corrigez le code de saut de ligne avec sed ou ʻecho`, cela fonctionnera.

(* Pour Windows. Peut-être qu'il se comporte différemment pour Mac?)


· Option Grep -f

grep -f [fichier de chaîne de recherche] [fichier cible de recherche]

・ Utiliser la déclaration while

while read line do grep "$ line" [Rechercher le fichier cible] done <[fichier de chaîne de recherche]

(* Dans ce style d'écriture, il est nécessaire de couper la dernière ligne de ** [Fichier de chaîne de caractères de recherche] ** (sinon, seule la dernière ligne ne sera pas lue). Les lignes qui remplissent plusieurs conditions apparaîtront plusieurs fois. Attention car ce sera fait)


Que ce passe-t-il

Comme indiqué ci-dessous, lors de la recherche de chaque ligne du fichier, le phénomène selon lequel seule "la ligne avec la chaîne de recherche à la fin" est sélectionnée peut se produire (ou plutôt se produire).

Fichier de chaîne de recherche (fichier.txt)


AAA
BBB

Rechercher le fichier cible (test.txt)


AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx
xxxCCCxxxxx

Seule la ligne avec la dernière chaîne de recherche est sélectionnée


$ grep -f file.txt test.txt
xxxxxxxxAAA
xxxxxxxxBBB

$ while read line
> do
> grep "$line" test.txt
> done < file.txt
xxxxxxxxAAA
xxxxxxxxBBB

Exemple de solution de contournement

1. commande sed

Tout va bien, donc si vous utilisez sed pour recréer ** [fichier de chaîne de recherche] **, cela fonctionnera correctement.

$ sed 's/^//' file.txt > file2.txt
$ grep -f file2.txt test.txt
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx

2. commande echo

Pour l'instruction while, relire $ line avec ʻecho` fonctionne également.

$ while read line
> do
> grep `echo $line` test.txt
> done < file.txt
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
xxAAAxxBBBx  ##
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx  ##Apparaît plusieurs fois si plusieurs conditions sont remplies

Autres remèdes

Exemples d'autres méthodes de conversion de code de saut de ligne ・ Conversion du code de saut de ligne

Commentaire

La cause de ce comportement était que le code de saut de ligne était différent entre Windows et Unix. En d'autres termes, si vous utilisez un fichier créé sous Windows comme chaîne de caractères de recherche, la partie ** \ r ** va interférer avec la recherche (recherchez "** chaîne de caractères de recherche + \ r **"), cherchez donc à la fin. Il ne frappait que s'il y avait une chaîne. (En fait, si vous supprimez le saut de ligne dans la deuxième ligne de ** file.txt **, "BBB" sera recherché normalement, et inversement, ** test.txt ** sera sed. Si vous modifiez le code de saut de ligne de CRLF à LF en exécutant, rien ne sera sorti.)

OS Code de saut de ligne 「od -À quoi ça ressemble en "c"
Unix LF \n
Mac(OSX) LF \n
Mac(OS9) CR \r
Windows CR+LF \r\n

Citation: Vérifier le code de saut de ligne

file.Lorsqu'il n'y a pas de pause dans la deuxième ligne (BBB) de txt


$ grep -f file.txt test.txt
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx

Rechercher le fichier cible (test.Quand sed est exécuté en txt) (rien n'est sorti)


$ sed 's/^//' test.txt > test2.txt
$ grep -f file.txt test2.txt


Lorsque vous utilisez sed ou ʻecho`, le code de saut de ligne est converti de ** CRLF (\ r \ n) ** à ** LF (\ n) ** pour que la recherche réussisse. Devenir.

Avant et après la commande sed


## ----------------------Avant sed(CRLF)
$ file file.txt
file.txt: ASCII text, with CRLF line terminators

$ od -c file.txt
0000000   A   A   A  \r  \n   B   B   B  \r  \n
0000012

## ----------------------Après sed(LF)
$ file file2.txt
file2.txt: ASCII text

$ od -c file2.txt
0000000   A   A   A  \n   B   B   B  \n
0000010

Avant et après la commande echo


$ cat hoge.txt
hoge

$ while read line
> do
> echo `echo $line` > hoge2.txt
> done < hoge.txt

## ----------------------avant l'écho(CRLF)
$ od -c hoge.txt
0000000   h   o   g   e  \r  \n
0000006

## ----------------------Après l'écho(LF)
$ od -c hoge2.txt
0000000   h   o   g   e  \n
0000005

Référence: ・ [Sed] Command (Basic) -Edit text file

Dans le cas de Mac, CR a été adopté dans l'ancien MacOS, mais après MacOSX, on dit qu'il s'agit du même LF que le système d'exploitation de type Unix.

[Linux] Convertir le code de saut de ligne

Recommended Posts

Que faire si l'option -f de grep ne fonctionne pas
Que faire si vous ne pouvez pas trier les fichiers avec des indices
Que faire si vous ne pouvez pas installer pyaudio avec pip #Python
Que faire si vous ne pouvez pas construire un projet avec Maven
Que faire lorsque le shell pipenv devient impossible
Que faire si PDO n'est pas trouvé dans Laravel ou CakePHP
Que faire si vous ne pouvez pas installer avec pip dans l'environnement babun
Que faire si vous ne pouvez pas installer mysqlclient
Que faire si vous ne pouvez pas vous connecter en tant que root
Que faire si vous ne pouvez pas utiliser le WiFi sous Linux
Que faire si vous obtenez une erreur de décodage Unicode avec l'installation de pip
Que faire si vous ne pouvez pas utiliser la poubelle dans Lubuntu 18.04.
Que faire si vous ne parvenez pas à envoyer un e-mail à Yahoo avec Python.
Que faire si vous ne pouvez pas utiliser la recherche de grille de sklearn en Python
Que faire si vous vous perdez dans la référence de fichier avec FileNotFoundError
Que faire lorsque TypeError se produit au minimum et au maximum de numpy
Que faire si vous obtenez Impossible de récupérer l'URL 443 avec pip
swapon failed: Que faire si vous vous fâchez contre l'opération non autorisée
Que faire si vous obtenez une erreur lors de l'installation de python avec pyenv
Aucun module nommé Que faire si vous obtenez "libs.resources"
ModuleNotFoundError: No module Que faire si vous obtenez 'sensorflow.contrib'
Liens pour faire ce que vous voulez avec Sublime Text
Ce que vous ne pouvez pas faire avec hstack ou vstack avec dstack
Que faire si vous obtenez une erreur OpenSSL lors de l'installation de Python 2 avec pyenv
Comment installer et utiliser pyenv, que faire si vous ne pouvez pas changer de version de Python
Que faire si vous obtenez une erreur d'importation lors de l'importation de matplotlib avec Jupyter
Que faire si vous exécutez python sur IntelliJ et quittez avec une erreur
[AWS] Que faire lorsque vous souhaitez piper avec Lambda
Que faire si vous êtes accro aux codes de caractères Windows
Que faire si Combinaisons devient «couverture inconnue»
Remède facile lorsque vous perdez votre paire de clés EC2
Que faire si yum casse
Que faire avec l'installation de Magics
Que faire avec la sortie de PYTHON?
Python | Ce que vous pouvez faire avec Python
Que faire si vous obtenez une erreur non définie lorsque vous essayez d'utiliser pip avec pyenv
Que faire si vous obtenez moins zéro en Python
Que faire si Intellisense ne fonctionne pas avec Anaconda + VSCode + Tensorflow2.1
Que faire lorsque vous obtenez "Je ne peux pas voir le site !!!!"
Ce que vous pouvez faire avec l'API vol.1
Ce que vous pouvez faire avec des compétences en programmation
Résumons ce que vous voulez faire.
Que faire si ipython et python démarrent avec des versions différentes
Que faire si vous vous fâchez avec TensorFlow v2 sans l'attribut "app"
Que faire si vous êtes bloqué pendant l'installation d'Anaconda sur Linux
Que faire si le mnist d'exemple Chainer (Windows) se termine par WinError 183.
Que faire si l'installation de pyenv ne se poursuit pas avec une erreur
Que faire si le serveur ne démarre pas avec python manage.py runserver
Que faire si une erreur se produit lors de l'importation de numpy avec VScode
Que faire si vous obtenez une erreur lors du chargement de mnist
Que faire si vous obtenez un avertissement "Mauvaise plateforme Python" lors de l'utilisation de Python avec l'EDI NetBeans
Que faire lorsque vous vous fâchez avec "Value Error: unknown local: UTF-8" dans python manage.py syncdb
Que faire si pipreqs aboutit à UnicodeDecodeError
Que faire si mod_fcgid ne peut pas résoudre UnicodeEncodeError
Que faire si les rails ne fonctionnent pas
Que faire si Scrapy ne fonctionne pas après l'installation de Scrapy avec PIP sur Mac