Sed 语法问题

Sed 语法问题

我正在修改原始 PCL/PS 文件(混合),由于某种原因,我无法让我的 Sed 语法正确地实现我希望它抓住的真正开始。以下是 strings 命令的输出示例:

*c50B
*c0P
&f1X
&f7y4X
%-12345X%!PS-Adobe-3.0 EPSF-3.0 <------Sed doesn't work for this pattern
%%Creator: tiff2ps  <----Sed works for this pattern
[data...]
%%EOF

这是我的有效 sed 命令:

sed -n '/%%Creator/,/%%EOF/p'

但我希望它以 %-12345X% 开头:

sed -n '/%-12345X%/,/%%EOF/p'

当我执行最后一个命令时,它只输出整个文件。该行的组合不起作用。现在,我正在查看带有“字符串”的原始打印文件,是否该行是以 sed 无法理解的方式编码的?有解决这个问题的想法吗?

编辑添加:

我很确定这与 PCL 的编码和行转义有关。文件从 PCL 转到 PS,并且不会在其自己的行上创建 PS 的第一条消息。 cat 的输出如下所示:

*c50BESC*c0PESC&f1XESC&f7y4XESC%-12345X%!PS-Adobe-3.0 EPSF-3.0
%%Creator: tiff2ps

答案1

我的猜测是 sed 正在做你告诉它要做的事情:打印出包含%-12345X%.但由于这不是一个 ASCII 文件,而是一个 PCL 或 PDF 文件,其中包含各种二进制字节 - 并且没有适当的换行符可言,直到“%%Creator:”前面 - 它打印出整个内容。请记住,sed 打印匹配的“行”。我认为你要求它做的是打印“从这个字符串开始”。

如果您想要获取一个不能保证是面向行的文件(例如这个),您将不得不使用一种不依赖于面向行工具的技术。这可能会有所帮助:如何转储二进制文件的一部分。它有点复杂,但你的字符串非常独特,所以它应该可以解决问题。

嗯......只是有一个想法 - 也许这会起作用。它删除 %-12345X% 前面同一“行”上的所有内容(该字符串本身除外)。然后它打印从该行到文件末尾的所有内容。我还没有尝试过,但这就是我的处理方法:

sed -n -e '/%-12345X%/s/.*%-12345X%/%-12345X%/' -e '/%-12345X%/,/%%EOF/p'

或者甚至更好:

STR="%-12345X%"
sed -n -e "/${STR}/s/.*${STR}/${STR}/" -e "/${STR}/,/%%EOF/p"

相关内容