patterns.txt:
"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"
Strings.xml
<string name="Introduction">One day there was an apple that went to the market.</string>
<string name="BananaOpinion">Bananas are great!</string>
<string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
Saída esperada:
"ExitWarning"
"SomeMessage"
"Help"
Como imprimo os termos em patterns.txt
que não são encontrados Strings.xml
? Eu posso imprimir os combinados / incomparáveis linhas em Strings.xml
, mas como faço para imprimir as inigualáveis padrões ? Estou usando o ggrep (GNU grep) versão 2.21, mas estou aberto a outras ferramentas. Desculpas se esta é uma duplicata de outra pergunta que não consegui encontrar.
Strings1.xml
eStrings2.xml
), também precisará da-h
bandeira no primeiro grep.grep
s suportam essa opção. Se você possui vários arquivos de entrada, não vejo por que você não pode simplesmentecat
todos eles e canalizar o resultadogrep
.A melhor abordagem é provavelmente o que o @don_crissti sugeriu, então aqui está uma variação sobre o mesmo tema:
Isso é basicamente o inverso da abordagem de @ don_crissti. Ele usa grep com Expressões regulares compatíveis com Perl (
-P
) e a-o
opção para imprimir apenas a parte correspondente da linha. Em seguida, o regex procuraname=
e descarta-o (\K
) e, em seguida, procura um ou mais caracteres até o primeiro"
(.+?"
). Isso resulta na lista de padrões presentes noString.txt
arquivo, que é passada como entrada para um grep reverso (grep -v
) usando a substituição de processo (<(command)
).fonte
Eu usaria
cut
, provavelmente. Ou seja, se, como parece, você sabe onde esperar a sequência de caracteres citada que está procurando.Se eu fizer:
... depois de salvar a minha própria cópia de seu exemplo
patterns.txt
nopat
e executar o comando acima, a saída é:cut
imprime em stdout apenas o segundo campo elimitado por"
aspas-d
duplas-f
para cada linha de entrada correspondente ao delimitador e-s
pressiona todas as outras.O que
cut
realmente imprimegrep
é:grep
procura no seu operando de arquivo nomeado por linhas que-v
não correspondam às-F
seqüências ixed em seu arquivo-
padrão stdin-f
.Se você pode confiar no segundo
"
campo delimitado como o que corresponder, será definitivamente uma otimização nogrep
-P
modo erl, apenas combinando-F
strings ixadas e apenas pequenas porções delas porquecut
faz o trabalho pesado - e rápido .fonte
é fácil de entender, mas tem o tempo de inatividade de gerar vários processos grep, um para cada linha em patterns.txt.
fonte
Outra maneira é colocar patterns.txt e Strings.xml em uma lista e encontrar linhas exclusivas
explicação:
cat patterns.txt Strings.xml
coloca tudo em uma lista.grep -oFf patterns.txt
remove o lixo em cada linha.sort
auto-explicativo. classifique todas as linhas.uniq -u
imprime apenas linhas exclusivas.fonte