我在带有Windows 7的windows64机器上使用cygwin bash。
我有一个grep的结果,我想要PREped一个字符串(文件的名称)。这个grep是一系列短管道的终止。
#!/bin/sh
for d in `ls extracted_xmls`
do
if [ -d "extracted_xmls/$d" ]; then
echo $d
fi
if [ -f "interim/$d.txt" ]; then
rm "interim/$d.txt"
fi
for f in `ls extracted_xmls/$d`
do
cat "extracted_xmls/$d/$f" | \
tr "\n" "|" | \
grep -o "<?GOVINT.*<?GOVINT" \
>> "interim/$d.txt"
done
done
这样可行,但我希望将文件名添加到输出中。 使用-H开关不起作用(因为输入是该点的标准输入)。
我试图从命令行首先获得一个较小的示例,而不是运行整个批处理文件。
我尝试使用类似的东西:
cat out150106.csv | sed "s/^/ho/"
这个有效!但是,我想做这样的事情:
cat out150106.csv | sed "s/^/$PATH/"
($ PATH只是一个方便的变量,这不是我想在上面的程序中使用的实际变量。)
当我尝试这个时,cygwin bash报道: sed:-e expression#1,char 6:`s'
的未知选项从谷歌搜索中可以看出,这种事情似乎适用于其他版本的Unix。 (顺便使用awk的类似问题。)
我怎么能在cygwin bash中做到这一点?
根据要求,我包含示例输入和输出文件。 示例输入:(路径/文件名为“ipg140107 / 2014_G_08622343.xml”)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE us-patent-grant SYSTEM "us-patent-grant-v44-2013-05-16.dtd" [ ]>
<us-patent-grant lang="EN" dtd-version="v4.4 2013-05-16" file="US08622343-20140107.XML" status="PRODUCTION" id="us-patent-grant" country="US" date-produced="20131224" date-publ="20140107">
<us-bibliographic-data-grant>
.... buncha stuff
</us-bibliographic-data-grant>
<description id="description">
... more stuff ...
<?GOVINT description="Government Interest" end="lead"?>
<heading id="h-0002" level="1">FEDERALLY SPONSORED RESEARCH</heading>
<p id="p-0003" num="0002">The invention was made with Government support under HR0011-07-C-0075 awarded by DARPA. The Government has certain rights in the invention.</p>
<?GOVINT description="Government Interest" end="tail"?>
... bunch more stuff ...
</us-patent-grant>
我正在寻找的输出是:
ipg140107/2014_G_08622343.xml:<?GOVINT description="Government Interest" end="lead"?>
<heading id="h-0002" level="1">FEDERALLY SPONSORED RESEARCH</heading>
<p id="p-0003" num="0002">The invention was made with Government support under HR0011-07-C-0075 awarded by DARPA. The Government has certain rights in the invention.</p>
<?GOVINT
请注意,我并不关心GOVINT处理指令是否不完整。这是一个临时文件,该信息是多余的。 每个目录中有数千个这样的输入文件。我需要grep每个文件并将grep附加到相同的输出文件(每个目录一个文件)。
答案 0 :(得分:3)
让我们从清理脚本开始做得更强大/更有效/类似shell:
for d in extracted_xmls/*
do
if [ -d "extracted_xmls/$d" ]; then
echo "$d"
fi
if [ -f "interim/$d.txt" ]; then
rm "interim/$d.txt"
fi
for f in "extracted_xmls/$d"/*
do
tr "\n" "|" < "extracted_xmls/$d/$f" |
grep -o "<?GOVINT.*<?GOVINT" \
>> "interim/$d.txt"
done
done
现在编辑您的问题以显示一些示例输入和预期输出,我们可以修改它以执行您想要的任何操作。
鉴于您现在告诉我们的内容,请将脚本更改为:
for d in extracted_xmls/*
do
if [ -d "extracted_xmls/$d" ]; then
echo "$d"
awk 'f; /<\?GOVINT/{if (!f) print FILENAME, $0; f=!f}' "extracted_xmls/$d"/* > "interim/$d.txt"
fi
done