Bash 从文本文件中提取匹配结果的行
我需要从文本文件中提取文件名,而文本文件上的输出没有字体 从下面的输出文件可以看出,我需要打印出第一个结果之后没有字体的结果?因此,只有最后一个结果在此输出中具有字体 这有意义吗?答案是Grep、Sed还是Awk 所以需要从下面的文本文件中输出,显示在**开始和**结束的PDf中没有字体Bash 从文本文件中提取匹配结果的行,bash,shell,awk,grep,Bash,Shell,Awk,Grep,我需要从文本文件中提取文件名,而文本文件上的输出没有字体 从下面的输出文件可以看出,我需要打印出第一个结果之后没有字体的结果?因此,只有最后一个结果在此输出中具有字体 这有意义吗?答案是Grep、Sed还是Awk 所以需要从下面的文本文件中输出,显示在**开始和**结束的PDf中没有字体 ******************START*********************** name type emb
******************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***********************
如果前一行以
-
开头,则打印包含“.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
下面是脚本的分解:
- 检测嵌入式字体计数。如果
在没有嵌入字体的情况下返回一个特定的值,那么这将很简单,但事实并非如此。因此,我们计算输出行的数量并减去2(标题行)以确定嵌入字体的数量pdffonts
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
这可能适合您:
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
说明:
*
sed -n '/^\*/,//{H;/\*END\*/{x;s|[^/]*-\n\(/[^\n]*\).*|\1|p}}' in.txt
问题解决到什么程度了?只需要包含在*开始和*结束的PDF文件名,这些文件名没有提到任何字体。我现在正在尝试awk,但没有乐趣:-(@Grimlockz你能编辑你的问题,根据你的输入示例添加一个预期的输出吗?你的评论对我来说也不清楚。“没有提到任何字体。”…现在为测试这一点干杯,它似乎起作用了感谢-
。!/bin/bash SAVEIFS=$IFS IFS=$(echo-en“\n\b”)MAGNUM=/mnt/network/User\1\PDF\06.12.11/对于$中的f(查找$MAGNUM-type f-name“*.PDF”)执行echo“******************************************开始************************************************************”pdffonts$f echo“$f”echo“*********************************************************结束”done>output.txt#restore$IFS IFS=$SAVEIFS
这是获取PDF信息的脚本,如果helps@Grimlockz很高兴它有帮助。顺便说一句,如果您使用该脚本更新了您的问题,以显示输入文件的来源以及您试图实现的目标,它可能会帮助其他读者。另请参见更新的答案以获取替代解决方案(假设您没有使用output.txt
进行任何其他操作)。非常感谢并注意到,将继续更新-使用新脚本,它看起来很棒,但由于文件夹文件名中的空格,它很难找到文件夹:-(