从文本文件中提取与结果匹配的行

时间:2011-12-14 10:29:55

标签: bash shell awk grep

我需要从文本文件中提取文件名,而文本文件中的输出没有字体。

因此,从下面的输出文件中可以看到,我需要在第一次结果后打印出没有字体的结果?因此,只有最后一个结果在此输出中有字体

这是否有意义 - 将Grep,Sed或Awk作为答案

因此需要下面的文本文件中的输出显示** START和** END中的该PDf中不存在任何字体

******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
/home/user1/Documents/temp1.pdf
******************END***********************
******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
/home/user1/Documents/temp2.pdf
******************END***********************
******************START***********************
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
BAAAAA+TimesNewRomanPS-BoldMT        TrueType          yes yes yes     14  0
CAAAAA+TimesNewRomanPSMT             TrueType          yes yes yes      9  0
/home/user3/Documents/temp file.pdf
******************END***********************

2 个答案:

答案 0 :(得分:1)

如果前一行以-开头,则打印包含“.pdf”的任何行。

[me@home]$ awk '{if (st && match($0,".pdf")){print $0}; st=match($0,"^-")}' in.txt
/home/user1/Documents/temp1.pdf
/home/user1/Documents/temp2.pdf

它不是通用解决方案,但可以使用您提供的输入数据。我可以想象一些可能会失败的边缘情况,但这完全取决于输入文件的规范。


更新

(基于您在下面的评论中发布的脚本)如果您要做的只是识别没有嵌入字体的PDF文件,这可能会有效:

MAGNUM="/mnt/network/User\ 1\ PDF\ 06.12.11/"
has_no_fonts() {
    COUNT=$(pdffonts "$1" 2> /dev/null | wc -l)
    exit $(( $COUNT - 4 ))
}
export -f has_no_fonts
find "$MAGNUM" -type f -name "*.pdf" -exec bash -c 'has_no_fonts "{}"' \; -print

以下是剧本的细分:

  • 检测嵌入字体数。如果没有嵌入字体,pdffonts返回特定值,那会很简单,但事实并非如此。因此,我们计算输出行数并扣除2(标题行)以确定嵌入字体的数量

    COUNT=$(pdffonts "$1" 2> /dev/null | wc -l) # number of output lines
                                                # exactly 2 if no fonts
                                                # exactly 0 if there are errors
    exit $(( $COUNT - 2 ))  # exit 0 (success) if and only if PDF has no fonts
    
  • 导出bash函数,因此可以在子shell中使用。

    export -f has_no_fonts
    
  • 找到pdf文件,只有在PDF有效且没有字体

    的情况下才打印出名称
    find .....  -exec bash -c 'has_no_fonts "{}"' \; -print
                      -------                        -------
                          |                             |
              -exec cannot run bash functions     Will only print 
               so run in a bash subshell       filename if prev command exit with 0
    

如果您更喜欢单行,则整个脚本可以写成:

find "$MAGNUM" -name "*.pdf" \
    -exec bash -c 'exit $(($(pdffonts "{}" 2> /dev/null |wc -l) - 2))' \; -print

答案 1 :(得分:1)

这可能对您有用:

sed -n '/^\*/,//{H;/\*END\*/{x;s/\n/&/6;t;s|[^/]*\([^\n]*\).*|\1|p}}' in.txt
/home/user1/Documents/temp1.pdf
/home/user1/Documents/temp2.pdf

说明:

  1. 专注于以*
  2. 开头的行之间的界限
  3. 将此类行存储在保留空间(HS)中。
  4. 当我们到达结束分隔符交换到HS时。
  5. 检查6个或更多新行,即必须包含字体的条目,如果是,请执行救助。
  6. 删除所有非必要文字并打印出来。
  7. 或者在紧要关头:

    sed -n '/^\*/,//{H;/\*END\*/{x;s|[^/]*-\n\(/[^\n]*\).*|\1|p}}' in.txt