我正在尝试从目录中的多个数据文件中提取两个文本字符串。我想使用 ~ 字符分隔文本字符串并将输出发送到一个文件。
示例目录名称:AND/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
使用的脚本仅使用一个 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 的更正