Komentáře
Odpověď
grep
won “ Tady vám nepomůžu. Toto je práce, kterou lépe zvládnete pomocí sed
pomocí výrazů rozsahu:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
potlačuje automatický tisk, takže se řádky tisknou, pouze pokud je to výslovně požadováno. A to se stane, když dojde k rozsahu /aaa/,/cdn/
.
Tyto výrazy rozsahu jsou k dispozici také v awk
, kde můžete říci:
awk "/zdk/,/dke/" file
Samozřejmě všechny tyto podmínky lze rozšířit na přísnější regulární výraz jako sed -n "/^aaa$/,/^cdn$/p" file
a zkontrolovat, zda řádky obsahují přesně aaa
a cdn
, nic jiného.
Komentáře
- Páni, měl jsem stejný problém a ' se mě nepýtal. Použil jsem 2 instance
grep -n
a porovnal jsem číslo pro mé řešení. - Výrazy rozsahu @KipK jsou tak užitečným nástrojem pro tento druh problémů:) Můžete také použijte
awk
a některé příznaky, ale základní případ je docela přímočarý. - @Fedorqui, mám problém, pokud vyhledávací vzor obsahuje xmls. například musím hledat od < ns0: abcd xmlns = " " >, získání resull. Zobrazuje však < abcd xmlns = " " > také. Vyzkoušel jsem sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p soubor
- @MukulAnand uveďte příklad, abychom mohli křížově zkontrolovat
- jakýmkoli způsobem ne vytisknout počáteční a koncový vzor sami (kromě použití hlavy a ocasu)?
odpověď
může provést sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
odpověď
Zde je grep
příkaz:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Víceřádkové shody můžete dosáhnout v grep
, ale musíte použít perl-regexp pro grep
(-P
– což není podporováno na každé platformě , jako OS X), takže jako řešení nahradíme nové řádky znakem _
a po grep
je měníme zpět.
Alternativně můžete použít pcregrep
, který podporuje víceřádkové vzory (-M
).
Nebo použijte ex
:
ex +"/aaa/,/cdn/p" -scq! file
/foo/,/bar/
definovat vzory. Specifika vzoru (například na konci) jsou sekundární.