使用 grep 提取文字的腳本

使用 grep 提取文字的腳本

我正在嘗試從目錄中的多個資料檔案中提取兩個文字字串。我想使用 ~ 字元分隔文字字串並將輸出發送到一個文件。

範例目錄名稱:/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 的修正

相關內容