Por que o seguinte fornece a linha que estou procurando:
grep '<appointment-id internal:ref=1.2.3/>' test.xml
OUTPUT is <appointment-id internal:ref=1.2.3/>
Enquanto o seguinte o divide em 2 linhas?
a=($(grep '<appointment-id internal:ref=1.2.3/>' test.xml))
for i in "${a[@]}"; do
echo "checking $i"
grep -n "$i" delete.xml
done
A saída é:
checking <appointment-id
checking internal:ref=1.2.3/>
O arquivo é:
<note>
<to>Jim</to>
<from>John</from>
<heading>Reminder</heading>
<body>Some text</body>
<appointment-id internal:ref=1.2.3/>
</note>
A saída do
grep
é uma string contendo duas palavras separadas por espaços em branco.O shell dividirá isso em duas palavras, pois não está entre aspas e, portanto, a matriz terá duas entradas.
Isso fará o que você deseja:
No entanto, analisar XML com
grep
é uma ideia horrível . Em vez disso, use um analisador XML adequado.Além disso, o loop, se tudo o que faz é gerar uma string, pode ser substituído por
Para ver quem fez uma alteração em uma linha que corresponde a um padrão em uma revisão específica de um
git
arquivo controlado (veja os comentários abaixo), usegit blame -L
com o padrão e a revisão em questão. Vejagit blame --help
para mais informações.Observe também que, para obter o número da linha de uma linha que corresponde a um padrão:
Nunca alimente o resultado de
grep
emgrep
novamente apenas para obter o número da linha. Se fizer isso, certifique-se de usargrep -F
, ou falhará se a linha contiver padrões de expressão regular.