我正在使用sed
来纠正一个两列PDF(使用pdftotext
3.03)转换问题。转换器有时会正常工作(首先打印左列文本,然后打印右列文本)。然而,有时它会在文本中的连字符处中断,并切换到以^left column + right column$
打印文本。
我想通过将所有左列文本打印到stdout
并使用右列文本构建一个多行保留空间来解决这个问题,然后将右列文本切换到模式空间并输出到stdout
。但是,我发现有几个转换校正案例需要使用保留空间来进行修复。
相反,我尝试将右列文本转储到外部文件中(rtcol.txt)暂时,以便我可以稍后检索它。但我似乎有问题的文件的内容打印到屏幕上。我怀疑这与sed
可能仍然有文件打开,并尚未写入缓存的文本到它的事实。请参见以下部分伪代码示例:
# Example of complicated case when hyphen causes a multiline issue
/regex to 1st line/ { h; s/ignored ltcol.*\(capture rtcol txt.*\).*- \(more rtcol.*$\)/\1\2/w rtcol.txt
x; s/\(capture ltcol.*\)ignore rtcol.*\(more ltcol.*\)-.*/\1\2/;
N; s/\(.*\)\n\(Get more ltcol from next line.*\)/\1\2/p; d;
}
# Section where converter at least separated the lines (ltcol \n rtcol)
/regex to next fix/ { n; p; n; w rtcol.txt
# Section where converter simply added the two lines (ltcol + rtcol)
n; s/^\(ltcol.*\) \(rtcol.*\)$/\1\n\2/; P; s/[^\n]*\n//w rtcol.txt
}
# After final correction, try to print out temp file contents
/regex to last fix/ { n; p; n; w rtcol.txt
r rtcol.txt
}
一开始,我以为这是sed
限制了你可以执行的UTF-8字符数,但现在我在临时文件中使用了~1900字节,我试图将临时文件保存到另一个文件中,它工作了(即使该文件不是按我的要求动态创建的)。
所以,我的问题是:你可以在同一个脚本中写入文件并提取其内容吗?有没有一种方法可以强制sed
将缓存的文本同步到文件中,然后从中读取?或者我应该使用不同类型的程序(例如awk
)或方法进行此转换校正过程?sed --version
是Debian 11中的sed (GNU sed) 4.7
1条答案
按热度按时间tjvv9vkg1#
找到了这个问题的答案。
起初,我以为这是sed的局限性,模式空间只能容纳这么多字符(每个链接,只有4000字节)。但在我的应用程序中,使用UTF-8编码(每个字符1字节),我最多只能容纳2000字节左右。
决定做一些源代码潜水,发现
GNU sed
确实有一个刷新输出功能。在sed上快速搜索了一下刷新输出,发现了这个stack overflow post by @Naab(在适当的地方给予信贷)。果然在源代码中也发现了-u
选项。因此,为了将来的参考,如果您需要使用外部文件作为文件解析的临时存储,请确保添加
-u
标志,如下所示(不超过4000字节):