Скрипт для извлечения текста с использованием grep
Я пытаюсь извлечь две текстовые строки из нескольких файлов данных в каталоге. Я хочу отделить текстовую строку с помощью символа ~ и отправить вывод в один файл.
Пример имени каталога: /xmldocs
И имена файлов являются именами файлов: 1.xml
, 2.xml
, 3.xml
Ожидаемый результат:
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
SCRIPT использовал вид работ только с одной командой grep
for i in `ls`
do
grep "Document ID:" $i
echo "~"
echo "\n"
done >> /xmldocs/1.txt
Когда я вставляю вторую команду grep; grep 'CI[^"]'
скрипт зависает и нет вывода.
Текущий выход
<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
~
Любая помощь благодарна. Я очень новичок в командах LINUX/UNIX, и мне нужно извлечь информацию из 20000 XML-файлов. Благодарю.
3 ответа
Идея состоит в том, чтобы обработать результат из grep и явно добавить его в выходной файл. Таким образом, вы можете использовать консоль для написания отладочных сообщений.
#/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'
Если это не работает, пожалуйста, опубликуйте другую строку, которую вы хотите, чтобы grep протестировал.
Что вы хотите paste
:
#!/bin/bash
for f in *.xml
do
paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt
Относительно того, почему скрипт может зависать при использовании вами grep 'CI[^"]'
, ты должен сбежать ^. С помощью grep 'CI[\^"]'
исправил проблему для меня. Это связано с тем, что символ моркови, даже в скобках, интерпретируется как отрицание.
РЕДАКТИРОВАТЬ: коррекция Steeldriver