Mám několik velkých textových souborů a v souboru UNIQS.txt
Mám seznam řetězců pro grep
z jiného souboru. Kód, který používám, je
grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
který nic nedělá – vygenerovaný soubor je prázdný. Ale když to udělám
grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam
funguje správně. To mě mate, protože jsem si nemyslel, že grep
by interpretoval položky v UNIQS.txt
jako vzory regulárních výrazů bez uvozovek a lomítek a tak dále, které jsou v souboru (které tam nejsou). Je to obecně tak, že když získáváte vzory ze souboru, bude si automaticky myslet, že jde o vzory regulárních výrazů?
Upravit: V UNIQS.txt
soubor, jsou zde řetězce formuláře oddělené novým řádkem
HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783
(nazývané názvy šablon) a soubor EEP_VSL...
sloupce oddělené tabulátory, s asi 14 sloupci a první sloupec je název šablony, takže v podstatě chci extrahovat řádek odpovídající každé šabloně v souboru.
Přijatá odpověď:
-f
volba určuje soubor, kde grep čte vzory. Je to jako předávání vzorů na příkazovém řádku (s -e
možnost, pokud je jich více než jeden), kromě toho, že když voláte z shellu, možná budete muset uvozovat vzor, abyste v něm chránili speciální znaky před rozbalením shellem.
Argument -E
nebo -F
nebo -P
, pokud existuje, říká grep, ve které syntaxi jsou vzory zapsány. Bez argumentu grep očekává základní regulární výrazy; s -E
, grep očekává rozšířené regulární výrazy; s -P
(pokud je podporováno), grep očekává regulární výrazy Perlu; a s -F
, grep očekává doslovné řetězce. Nezáleží na tom, zda vzory pocházejí z příkazového řádku nebo ze souboru.
Všimněte si, že řetězce jsou podřetězce:pokud předáte a+b
jako vzor pak řádek obsahující a+b+c
se shoduje. Pokud chcete hledat řádky obsahující přesně jeden z dodaných řetězců a ne více, předejte -x
možnost.