使用 grep 提取文本的脚本

使用 grep 提取文本的脚本

我正在尝试从目录中的多个数据文件中提取两个文本字符串。我想使用 ~ 字符分隔文本字符串并将输出发送到一个文件。

示例目录名称:AND/xmldocs 文件名为:1.xml,,2.xml3.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

使用的脚本仅使用一个 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 的更正

相关内容