找到图案并在前面插入换行符

时间:2015-12-10 10:25:53

标签: regex bash shell latex newline

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

cat "$1" | tr -d '\n' | sed 's/\t* *\\/\n\\/g'
  1. 阅读文件
  2. 删除所有换行符(将所有内容放在一行中)
  3. 查找所有出现的反斜杠,并在其前面显示任意给定数量的制表符和空格。用换行符替换它们,然后用反斜杠替换它们
  4. 现在可悲的是,这不起作用。更具体一点:sed命令不起作用,我不太明白为什么。

    PS:我在OSX上,并且喜欢适用于Linux和OSX的解决方案。

1 个答案:

答案 0 :(得分: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
  • ,在替换中打印了捕获的组

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