linux 如何使用sed在同一脚本中写入/读取临时文件

hgb9j2n6  于 2023-03-29  发布在  Linux
关注(0)|答案(1)|浏览(156)

我正在使用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

tjvv9vkg

tjvv9vkg1#

找到了这个问题的答案。
起初,我以为这是sed的局限性,模式空间只能容纳这么多字符(每个链接,只有4000字节)。但在我的应用程序中,使用UTF-8编码(每个字符1字节),我最多只能容纳2000字节左右。
决定做一些源代码潜水,发现GNU sed确实有一个刷新输出功能。在sed上快速搜索了一下刷新输出,发现了这个stack overflow post by @Naab(在适当的地方给予信贷)。果然在源代码中也发现了-u选项。
因此,为了将来的参考,如果您需要使用外部文件作为文件解析的临时存储,请确保添加-u标志,如下所示(不超过4000字节):

pdftotext -y 130 -W 700 -H 560 <PDF File> - | sed -n -u -f script.sed

相关问题