【问题标题】:Prepending lines of output with contents of a shell variable in CYGWIN在 CYGWIN 中使用 shell 变量的内容添加输出行
【发布时间】:2023-04-06 17:52:01
【问题描述】:

我在装有 windows 7 的 windows64 机器上使用 cygwin bash。

我有一个 grep 的结果,我想在其中添加一个字符串(文件名)。这个 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 表达式 #1,字符 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 附加到同一个输出文件(每个目录一个文件)。

【问题讨论】:

  • 从 sed 正则表达式的角度来看,您的可变内容内容似乎是特殊字符。也许之前有一个小集合 -vx 以获得 excat 上下文
  • $PATH 总是包含 /s,这将终止 sed 中的 s/... 命令,因此对于试图告诉我们您的真实变量可以包含的任何内容,这可能是一个非常糟糕的代理选择。

标签: bash sed cygwin environment-variables prepend


【解决方案1】:

让我们从清理脚本开始,让它变得更健壮/高效/类似于 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

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多