Você pode usar o comando sed
N
para ler várias linhas no espaço padrão.
Para encontrar o primeiro:
sed -nr '/\}/N; /.*\}.*\n.*"Wed Oct 19 .* 2016/Ip' file
e para remover a linha anterior:
sed -nr '/}/N; s/.*}.*\n(.*"Wed Oct 19 .* 2016)//Ip' file
O problema é que sed
não informa de qual arquivo a linha é, e não possui um sinalizador de pesquisa de arquivo recursivo (afaik). Isso pode ser conseguido ativando a globalização recursiva com **
no shell (mas o problema "de qual arquivo veio?" Permanece):
shopt -s globstar
sed -nrs '/}/N; s/.*}.*\n(.*"Wed Oct 19 .* 2016)//Ip' **
Com vários arquivos, adicione o sinal -s
para que sed
considere o fluxo como arquivos separados (para evitar correspondências indesejadas de várias linhas)
Você pode adicionar sua expressão detalhada no meio ...
sed -nrs '/}/N; s/.*}.*\n(.*"Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016)//Ip' **
Para a segunda ocorrência sem }
na linha anterior
sed -nr '/^[^}]*$/N; /.*\n.*"Wed Oct 19 .* 2016/Ip' file
e removendo a linha anterior:
sed -nr '/^[^}]*$/N; s/.*\n(.*"Wed Oct 19 .* 2016)//Ip' file
Para combinar isso em algo mais útil:
for f in **; do [[ -f "$f" ]] && echo -e ""$f":\n tweet: $(sed -nr '/}/N; s/.*}.*\n(.*"Wed Oct 19 .* 2016)//Ip' "$f")\n image: $(sed -nr '/^[^}]*$/N; s/.*\n(.*"Wed Oct 19 .* 2016)//Ip' "$f")"; done
ou ... ligeiramente mais legível (!)
#!/bin/bash
shopt -s globstar
for f in **; do
[[ -f "$f" ]] &&
echo -e ""$f":\n tweet: $(sed -nr '/}/N; s/.*}.*\n(.*"Wed Oct 19 .* 2016)//Ip' "$f")"
done
Isto dá saída parecida com:
file1:
tweet: "created_at": "Wed Oct 19 12:36:54 +0000 2016"
image: "created_at": "Wed Oct 19 somethingsomething 2016"
file2:
tweet: "created_at": "Wed Oct 19 random-chars 2016"
image: "created_at": "Wed Oct 19 whatever 2016"
Se você quiser excluir um ou outro, remova a parte relevante do script, por exemplo, para obter apenas o tweet ...
for f in **; do
[[ -f "$f" ]] &&
echo -e ""$f":\n tweet: $(sed -nr '/}/N; s/.*}.*\n(.*"Wed Oct 19 .* 2016)//Ip' "$f")"
done
Notas
-
sed -n
fica quieto até que solicitemos saída - isso é usado em combinação com o comando p
print para imitar a ação de grep
-
-r
usa regex estendido
-
/}/N
encontra uma linha com }
e lê a próxima linha no espaço padrão
-
/^[^}]*$/N
encontra uma linha sem }
e lê a próxima linha no espaço padrão
-
I
procura insensível a maiúsculas
-
p
imprime as linhas encontradas / editadas
-
s/old/new
replace old
com new