Usando o awk
$ awk '/test1/{line=$0; while (!(line ~ /[^\]".*[^\]"/)) {getline; line=line "\n" $0}; print line}' sentence.txt
20 /test1/catergory="Food"
20 /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20 /test1/type="Western"
20 /test1/theme="Halloween"
/test1/ é uma condição. Se a linha atual contiver uma correspondência para o regex test1 , os comandos nas chaves serão executados. Esses comandos são:
-
line=$0O conteúdo da linha atual é salvo na linha da variável.
-
while (!(line ~ !/[^\]".*[^\]"/)) {getline; line=line "\n" $0}Se o conteúdo atual de
linenão contiver duas citações sem escape, obtenha a próxima linha,getlinee anexe-a alinevialine=line "\n" $0 -
print lineAgora que a variável
linecontém duas citações sem escape, nós a imprimimos.
Para aqueles que preferem seus comandos espalhados por várias linhas, o mesmo comando acima pode ser escrito como:
awk '
/test1/{
line=$0
while (!(line ~ /[^\]".*[^\]"/)) {
getline
line=line "\n" $0
}
print line
}' sentence.txt
Usando sed
$ sed -n '/test1/{:a; /[^\]".*[^\]"/{p;b}; N; ba}' sentence.txt
20 /test1/catergory="Food"
20 /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20 /test1/type="Western"
20 /test1/theme="Halloween"
Como funciona:
-
-nIsso diz ao sed para não imprimir nada a menos que explicitamente o solicitemos.
-
/test1/{...}Para qualquer linha contendo
test1, executamos os comandos em chaves, que são:-
:aIsso define um rótulo
a. -
/[^\]".*[^\]"/{p;b}Se o espaço padrão atualmente contém duaspas sem escape, nós imprimimos o espaço padrão,
p, e então pulamos o resto das instruções e a ramificação,b, para recomeçar na próxima linha. -
NSe chegarmos aqui, isso significa que a corrente não tem duas citações sem escape. Nós lemos na próxima linha no espaço padrão.
-
baRetornamos para o rótulo
ae repetimos os comandos que seguem esse rótulo.
-