【发布时间】: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