(9 risposte)
Chiuso 2 anni fa.
È possibile eseguire una corrispondenza di pattern multilinea usando sed
, awk
o grep
? Prendi ad esempio, vorrei ottenere tutte le righe tra {
e }
Quindi dovrebbe essere in grado di corrispondere
1. {}
2. {.....}
3. {.....
.....}
Inizialmente la domanda utilizzava <p>
come esempio. Modificata la domanda per utilizzare {
e}
.
Risposta accettata:
Anche se sono d'accordo con il consiglio di cui sopra, che vorrai ottenere un parser per qualcosa di più di un minuscolo o completamente ad hoc, è (appena 😉 possibile abbinare blocchi multilinea tra parentesi graffe con sed.
Ecco una versione di debug del codice sed
sed -n '/[{]/,/[}]/{
p
/[}]/a
end of block matching brace
}' *.txt
Alcune note,
- -n significa "nessuna riga di stampa predefinita durante l'elaborazione".
- 'p' significa adesso stampa la riga.
- Il costrutto
/[{]/,/[}]/
è un'espressione di intervallo. Significa scansionare finché non trovi qualcosa che corrisponda al primo pattern(/[{]/)
E poi scansiona fino a trovare il secondo modello(/[}]/)
QUINDI esegui tutte le azioni che trovi tra { } nel codice sed. In questo caso 'p' e il codice di debug. (non spiegato qui, usalo, modificalo o eliminalo come funziona meglio per te).
Puoi rimuovere il debug /[}]/a fine blocco quando dimostri con soddisfazione che il codice corrisponde davvero ai blocchi delimitati da {,}.
Questo esempio di codice salterà tutto ciò che non è all'interno di una coppia di parentesi graffe.
Sarà facilmente confuso se hai {,} extra incorporato in stringhe, reg-exps, ecc., OR dove la parentesi graffa di chiusura è la stessa linea , (grazie a fred.bear)
Spero che questo aiuti.