在CYGWIN

时间:2015-06-03 12:49:08

标签: bash sed cygwin environment-variables prepend

我在带有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附加到相同的输出文件(每个目录一个文件)。

1 个答案:

答案 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