查找模式并在前面插入换行符

Find pattern and insert a line break in front

我想解析一个完全有效的 LaTeX 文档,但在涉及空格、制表符和换行符时可能会被打乱。因为 LaTeX 文件中的所有元素都以反斜杠开头,所以我想在每个反斜杠之前插入一个新的换行符,并将其后面的内容全部排成一行,直到出现下一个反斜杠。我试过这个:

cat "" | tr -d '\n' | sed 's/\t* *\/\n\/g'
  1. 读取文件
  2. 删除所有换行符(让所有内容都在一行中)
  3. 查找所有出现的反斜杠前面有任意给定数量的制表符和空格。用换行符和反斜杠替换它们

现在遗憾的是这不起作用。更具体地说:sed 命令不起作用,我不太明白为什么。

PS:我在 OSX 上,希望有一个适用于 Linux 和 OSX 的解决方案。

这不起作用,因为您需要使用引号 ' 来为 sed 提供模式。这些引号阻止 bash 用实际的换行符替换 \n

如果你真的想做你描述的事情,使用 trsed 你应该在你的命令中引入一个真正的换行符:

cat "" | tr -d '\n' | sed 's/\t* *\/\
\/g'

另一种方法,如果您使用 bash,是使用类似 ANSI C 的引号 ($'string'),其中只替换转义序列(但您仍然需要转义 \ 你介绍的新线路):

cat "" | tr -d '\n' | sed 's/\t* *\/\'$'\n''\/g'

有关 quoting with bash 的更多详细信息,请参阅此 wiki 页面。

如果你真的想用一个新行和相同数量的 \,你可以试试这个命令:

cat "" | tr -d '\n' | sed 's/[[:space:]]*\(\\*\)/\'$'\n''/g'
  • 来自 class [[:space:]]
  • 的任意数量的字符
  • 后跟一个 \(转义)和任意数量的另一个 \(转义)
  • 最后一组由转义括号捕获
  • 由于
  • ,捕获的组在替换中打印

但是,正如您的问题的评论中所建议的那样,这可能不是您真正想要更正 Latex 文档的方法(但这可能是另一个问题)。