Tato otázka již má odpovědi zde :

Komentáře

  • Myslím, že druhá otázka je příliš konkrétní na to, aby mohla být duplikována. Většina odpovědí odtud nebude fungovat ', protože existují různé požadavky (zadáním dalších znaků nového řádku).
  • Myslím, že zde začátek a koncové vzory mohou být kdekoli v souboru (není nutné dělat s novými řádky), i přes daný konkrétní příklad, druhý žádá o celé řádky.
  • @kenorb it ' stále stejný nápad. Hlavním trikem je použít jeden z nástrojů, které umožňují /foo/,/bar/ definovat vzory. Specifika vzoru (například na konci) jsou sekundární.
  • Tato odpověď může být také použitelná: stackoverflow.com/a/48022994/ 2026975

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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *