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?)
grep -f
ou while
pour lire une ligne à la fois ( while read line
).grep -f [fichier de chaîne de recherche] [fichier cible de recherche]
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)
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
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
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
Exemples d'autres méthodes de conversion de code de saut de ligne ・ Conversion du code de saut de ligne
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.
Recommended Posts