
Estou tentando extrair duas strings de texto de vários arquivos de dados em um diretório. Quero separar a string de texto usando um caractere ~ e enviar a saída para um único arquivo.
Exemplo de nome de diretório: /xmldocs
E os nomes dos arquivos são nomes de arquivos: 1.xml
, 2.xml
,3.xml
Resultado esperado:
TEXT_STRING_ONE~TEXT_STRING_TWO ------- This is from 1.xml
TEXT_STRING_ONE~TEXT_STRING_TWO ------- This is from 2.xml
TEXT_STRING_ONE~TEXT_STRING_TWO ------- This is from 3.xml
O SCRIPT usado funciona com apenas um comando grep
for i in `ls`
do
grep "Document ID:" $i
echo "~"
echo "\n"
done >> /xmldocs/1.txt
Quando insiro o segundo comando grep; grep 'CI[^"]'
o script trava e não há saída.
A saída atual é
<KMS_data id="KMS_documentId" name="Document ID:">12</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">19</KMS_data>
~
<KMS_data id="KMS_documentId" name="Document ID:">6</KMS_data>
~
grep "Document ID:" $i
~
grep "Document ID:" $i
~
grep "Document ID:" $i > /xmldocs/1.txt
~
Qualquer ajuda é apreciada. Sou muito novo em comandos LINUX/UNIX e preciso extrair as informações de 20.000 arquivos xml. Obrigado.
Responder1
A ideia é processar o resultado do grep e anexá-lo explicitamente ao arquivo de saída. Dessa forma você pode usar o console para escrever mensagens de depuração.
#/bin/bash
# Save output to this file
outputFile='./xmldocs/1.txt'
rm -f $outputFile
# List only *.xml files and iterate
for i in `ls *.xml`
do
# Echo which file is being processed (only printed to console )
echo 'Processing :'$i
# Grep, remove trailing newline and append to $outputFile
grep "Document ID:" -s $i | tr -d '\n' >> $outputFile
# Add char to separate
printf "~" >> $outputFile
# Grep, remove trailing newline and append to $outputFile
grep 'CI[^"]' -s $i | tr -d '\n' >> $outputFile
# Print newline to separate results
printf "\n" >> $outputFile
done
echo '!! done'
Se isso não funcionar, poste a outra linha que você deseja usar o grep para testá-la.
Responder2
O que você quer é paste
:
#!/bin/bash
for f in *.xml
do
paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt
Responder3
Quanto ao motivo pelo qual o script pode estar travado com o uso de grep 'CI[^"]'
, você deve escapar de ^. Usar grep 'CI[\^"]'
corrigiu o problema para mim. Isso ocorre porque o símbolo da cenoura, mesmo entre colchetes, é interpretado como negação.
EDIT: Correção do Steeldriver