ich data.txt
haben werden, die das folgende Formatbash grep für eine Mischung aus Sonderzeichen, von denen einige interpretiert buchstäblich
blah<TAB>string1_with_spaces_quotes_dots_etc<TAB>blah
blah<TAB>string2_with_spaces_quotes_dots_etc<TAB>blah
...
Einige der stringJ_...
erscheinen mehr als einmal hat. Die Datei ist in keiner Weise sortiert.
Ich habe auch strings.txt
, die die Form haben
stringA_with_spaces_quotes_dots_etc
stringC_with_spaces_quotes_dots_etc
stringB_with_spaces_quotes_dots_etc
...
Diese Strings nur einmal erscheinen, aber diese Datei ist entweder nicht sortiert.
Was ich brauche, ist für jede Zeichenfolge von strings.txt
finden Linien in data.txt
, wo die mittlere Saite ist genau derjenige von strings.txt
. So zum Beispiel, wenn die Zeichenfolge ich suche ist
foo.
Dann brauche ich
blah<TAB>foo.<TAB>blah
die folgenden Zeilen zu extrahieren, aber nicht Zeilen wie
blah<TAB>foo. bar<TAB>blah
blah<TAB>foo<TAB>blah
Die Schwierigkeit hier ist, dass diese Zeichenfolgen Zeichen wie Punkte haben können, die als spezielle Zeichen interpretiert werden können, während ich wörtliche Übereinstimmungen benötige.
Was ist der richtige Satz von grep
Optionen in der Schleife unten? Oder sollte ich insgesamt einen anderen Befehl verwenden?
while read t
do
grep <OPTIONS> "\t${t}\t" data.txt
done < strings.txt
Haben Sie die Manpage gelesen. Es wird erläutert, wie literale Zeichenfolgen abgeglichen werden. – 123
'grep -F' oder' fgrep'. – bishop
Es sieht so aus, als ob sowohl fgrep (als auch grep -F) verhindern, dass das \ t in eine Registerkarte expandiert wird. In vi und in der Shell selbst können Sie^V (drücken Sie Strg-V und dann die Tab-Taste) verwenden, um eine literale Registerkarte in Ihren Code einzufügen, und dann sollte sich fgrep verhalten ... –