处理纯文本

处理纯文本

我目前正在尝试排版具有特定结构的纯文本文件。有一件事我无法完成,那就是以下内容。我的纯文本结构如下:

"lorem ipsum dolor sit amet." (A block of text.)


Title

"lorem ipsum dolor sit amet." (A block of text.)

因此,我的文档中的每个部分上方都有一个标题(以“/newline”分隔),并且每个部分与其他部分的分隔距离是该标题的两倍。

基本上我想将上述内容转换为:

"lorem ipsum dolor sit amet." (A block of text.)

\section{Title}
"lorem ipsum dolor sit amet." (A block of text.)

可以做这样的事吗?

答案1

虽然直接在 (La)TeX 中执行此类转换当然是可能的(而且可能也很有趣),但我只会使用perl或类似的支持跨多行搜索和替换的工具。对于你的情况:

perl -0777 -i.bak -pe 's/\n\n\n(.*)\n\n/\n\n\\section{\1}\n/' plain.txt

将相应地转换文件text.txt

一些细节:

  • -0777选项使perl文件立即被读取,这对于跨多行匹配是必要的。

  • 该文件plain.txt将被“就地”修改(-i选项),但会在 中创建一个备份plain.bak(提供给 的后缀-i)。

  • 在正则表达式中,我们搜索三个连续的换行符,\n\n\n后跟以(.*)两个换行符终止的任意文本\n\n

  • 在替换部分,我们插入两个换行符\n\n,后跟\section{...}命令和另一个换行符\n\1用搜索正则表达式的第一个括号表达式替换,在本例中是匹配的“任意文本”。

答案2

如果我理解你的问题,你需要将每个段落(由空行分隔)解释为章节标题,前提是这些段落前面正好有两个空行。你可以试试这个:

\def\par{\endgraf\futurelet\next\parA}
\def\parA{\ifx\next\par \expandafter\sect\fi}
\long\def\sect#1#2\par{\bigskip{\bf #2}\par\nobreak\medskip}

block of text


section title

first paragraph block of text block of text block of text

second paragraph block of text block of text block of text


sect2 title

next paragraph block of text block of text block of text

\bye

但是这段代码非常脆弱。\bye例如,您可以尝试在之前插入两个空行,但会出错。如果在宏之间插入空行,那么如果有两个连续的空行,您就会遇到新的问题。

答案3

使用 Notepad++,使用扩展搜索模式并查找三个返回到您输入的行(两个空行)

\r\n\r\n\r\n

将其替换为

\r\n\r\n\r\n\section{

通过了解 \r\n\r\n" 后面的内容来关闭 \section 命令。替换

\r\n\r\n"

经过

}\r\n"

然后你将会转变

"lorem ipsum dolor sit amet." (A block of text.)


Title

"lorem ipsum dolor sit amet." (A block of text.)

到:

"lorem ipsum dolor sit amet." (A block of text.)

\section{Title}
"lorem ipsum dolor sit amet." (A block of text.)

相关内容