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=$0
O conteúdo da linha atual é salvo na linha da variável.
-
while (!(line ~ !/[^\]".*[^\]"/)) {getline; line=line "\n" $0}
Se o conteúdo atual de
line
não contiver duas citações sem escape, obtenha a próxima linha,getline
e anexe-a aline
vialine=line "\n" $0
-
print line
Agora que a variável
line
conté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:
-
-n
Isso 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:-
:a
Isso 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. -
N
Se 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.
-
ba
Retornamos para o rótulo
a
e repetimos os comandos que seguem esse rótulo.
-