【问题标题】:Find pattern and insert a line break in front查找模式并在前面插入换行符
【发布时间】:2015-12-10 10:25:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可能只想为 single 反斜杠添加换行符,对吧?不是每个反斜杠,比如 `\\`
  • 请在您的问题中添加示例输入和该示例输入所需的输出。

标签: regex bash shell latex newline


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2014-03-18
    • 2016-12-09
    • 2023-02-02
    相关资源
    最近更新 更多