
我正在嘗試從目錄中的多個資料檔案中提取兩個文字字串。我想使用 ~ 字元分隔文字字串並將輸出發送到一個文件。
範例目錄名稱:/xmldocs
AND 檔案名稱是檔案名稱: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 指令非常陌生,我需要從 20,000 個 xml 檔案中提取資訊。謝謝。
答案1
這個想法是處理 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 測試的另一行。
答案2
你想要的是paste
:
#!/bin/bash
for f in *.xml
do
paste -d '~' <(grep 'Document ID:' "$f") <(grep 'CI[\^"]' "$f")
done > /xmldocs/1.txt
答案3
關於為什麼腳本可能會因您使用 而掛起grep 'CI[^"]'
,您應該轉義 ^。使用grep 'CI[\^"]'
為我解決了這個問題。這是因為胡蘿蔔符號,即使在括號範圍內,也會被解釋為否定。
編輯:Steeldriver 的修正