Wenn Sie grep -f
verwenden und es passiert, dass nur **" die Zeile am Ende der Suchzeichenfolge "getroffen wird ***
Der Zeilenvorschubcode kann die Ursache sein.
→ Der Inhalt ist, dass es funktioniert, wenn Sie den Zeilenvorschubcode mit "sed" oder "echo" korrigieren.
(* Für Windows. Vielleicht verhält es sich für Mac anders?)
grep -f
oder while
verwenden, um zeilenweise zu lesen ( while read line
).grep -f [Suchzeichenfolgendatei] [Suchzieldatei]
while read line do grep "$ line" [Zieldatei suchen] done <[Suchzeichenfolgendatei]
(* In diesem Schreibstil muss die letzte Zeile von ** [Zeichenzeichendatei suchen] ** unterbrochen werden (andernfalls wird nur die letzte Zeile nicht gelesen). Zeilen, die mehrere Bedingungen erfüllen, werden häufig angezeigt. Sei vorsichtig, denn es wird getan.
Wie unten gezeigt, kann bei der Suche nach jeder Zeile in der Datei das Phänomen auftreten, dass nur "die Zeile mit der Suchzeichenfolge am Ende" ausgewählt ist (oder eher passiert ist).
Suchzeichenfolgendatei (Datei.txt)
AAA
BBB
Zieldatei durchsuchen (Test.txt)
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx
xxxCCCxxxxx
Es wird nur die Zeile mit der letzten Suchzeichenfolge ausgewählt
$ grep -f file.txt test.txt
xxxxxxxxAAA
xxxxxxxxBBB
$ while read line
> do
> grep "$line" test.txt
> done < file.txt
xxxxxxxxAAA
xxxxxxxxBBB
Alles ist in Ordnung. Wenn Sie also sed
verwenden, um ** [Suchzeichenfolgendatei] ** neu zu erstellen, funktioniert es gut.
$ sed 's/^//' file.txt > file2.txt
$ grep -f file2.txt test.txt
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx
Für die "while" -Anweisung funktioniert auch das erneute Lesen von "$ line" mit "echo".
$ while read line
> do
> grep `echo $line` test.txt
> done < file.txt
AAAxxxxxxxx
xxxxxAAAxxx
xxxxxxxxAAA
xxAAAxxBBBx ##
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx ##Erscheint oft, wenn mehrere Bedingungen erfüllt sind
Beispiele für andere Konvertierungsmethoden für Zeilenvorschubcodes ・ Konvertierung des Zeilenvorschubcodes
Die Ursache für dieses Verhalten war, dass der Zeilenvorschubcode zwischen Windows und Unix unterschiedlich war. Mit anderen Worten, wenn Sie eine unter Windows erstellte Datei als Suchzeichenfolge verwenden, stört der Teil ** \ r ** die Suche (Suche nach "** Zeichenzeichenfolge + \ r **"). Suchen Sie also am Ende. Es traf nur, wenn es eine Schnur gab. (Wenn Sie den Zeilenumbruch in der zweiten Zeile von ** file.txt ** entfernen, wird "BBB" normal durchsucht. Umgekehrt wird ** test.txt ** "sed". Wenn Sie den Zeilenvorschubcode durch Ausführen von CRLF in LF ändern, wird nichts ausgegeben.)
OS | Zeilenvorschubcode | 「od -Wie es in "c" aussieht |
---|---|---|
Unix | LF | \n |
Mac(OSX) | LF | \n |
Mac(OS9) | CR | \r |
Windows | CR+LF | \r\n |
Zitat: Zeilenvorschubcode überprüfen
file.Wenn in der zweiten Zeile (BBB) von txt keine Unterbrechung vorliegt
$ grep -f file.txt test.txt
xxxxxxxxAAA
BBBx BBB xx
xxxxxxxxBBB
xxAAAxxBBBx
Zieldatei durchsuchen (Test.Wenn sed in txt ausgeführt wird) (nichts wird ausgegeben)
$ sed 's/^//' test.txt > test2.txt
$ grep -f file.txt test2.txt
Wenn Sie sed
oder echo
verwenden, wird der Zeilenvorschubcode von ** CRLF (\ r \ n) ** in ** LF (\ n) ** konvertiert, sodass die Suche funktioniert. Werden.
Vor und nach dem sed-Befehl
## ----------------------Vor 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
## ----------------------Nach sed(LF)
$ file file2.txt
file2.txt: ASCII text
$ od -c file2.txt
0000000 A A A \n B B B \n
0000010
Vor und nach dem Echo-Befehl
$ cat hoge.txt
hoge
$ while read line
> do
> echo `echo $line` > hoge2.txt
> done < hoge.txt
## ----------------------vor dem Echo(CRLF)
$ od -c hoge.txt
0000000 h o g e \r \n
0000006
## ----------------------Nach dem Echo(LF)
$ od -c hoge2.txt
0000000 h o g e \n
0000005
Referenz: ・ [Sed] Command (Basic) - Textdatei bearbeiten
Im Fall von Mac wurde CR in das vorherige MacOS übernommen, aber nach MacOSX wird gesagt, dass es das gleiche LF wie Unix-Betriebssystem ist.