(9 odpovědí)
Uzavřeno před 2 lety.
Je možné provést shodu víceřádkového vzoru pomocí sed
, awk
nebo grep
? Vezměme si například, chtěl bych získat všechny řádky mezi {
a }
Takže by to mělo být schopné odpovídat
1. {}
2. {.....}
3. {.....
.....}
Zpočátku otázka používala <p>
jako příklad. Upravili otázku tak, aby používala {
a}
.
Přijatá odpověď:
I když souhlasím s výše uvedenou radou, že si budete chtít pořídit analyzátor na cokoli víc než na drobné nebo zcela ad-hoc, je (sotva 😉 možné spárovat víceřádkové bloky mezi složenými závorkami se sed.
Zde je ladicí verze kódu sed
sed -n '/[{]/,/[}]/{
p
/[}]/a
end of block matching brace
}' *.txt
Několik poznámek,
- -n znamená „žádné výchozí tiskové řádky při zpracování“.
- „p“ znamená teď vytisknout řádek.
- Konstrukt
/[{]/,/[}]/
je rozsahový výraz. Znamená to skenovat, dokud nenajdete něco, co odpovídá prvnímu vzoru(/[{]/)
A pak skenujte, dokud nenajdete 2. vzor(/[}]/)
PAK proveďte jakoukoli akci, kterou najdete mezi { } v kódu sed. V tomto případě „p“ a ladicí kód. (není zde vysvětleno, použijte jej, upravte jej nebo jej vyjměte, jak vám nejlépe vyhovuje).
Konec /[}]/a ladění bloku můžete odstranit, když ke své spokojenosti prokážete, že kód skutečně odpovídá blokům odděleným {,}.
Tato ukázka kódu přeskočí vše, co není uvnitř páru složených závorek.
Jak poznamenali ostatní výše, bude to snadno zmatené, pokud budete mít nějaké další {,} vložené do řetězců, reg-exps atd., NEBO kde uzavírací složená závorka je stejná čára , (s díky fred.bear)
Doufám, že to pomůže.