在一份很长的文档中,我想有选择地删除确切字符串 \begin{enumerate*}
之前的特定换行符,最好在 bash 或 zsh 中使用单行符。
也就是说,我要转换test.tex:
Text in paragraphs.
More text
\begin{enumerate*} \item thing
至
Text in paragraphs.
More text \begin{enumerate*} \item thing
像这样的单行
cat test.tex | perl -p -e 's/\n(?=(\\begin\{enumerate\*\}))/ /'
或
cat test.tex | perl -p -e 's/\n\\begin\{enumerate\*\}/\\begin{enumerate*}/'
但我一定错过了一些东西,因为它没有做出任何改变。
我在这里显然也不需要正则表达式。如果有一种方法可以使用精确的字符串匹配而不是正则表达式来做到这一点,我宁愿使用这种方式。例如,在 R 中,我可以使用 sub("\n\\begin{enumerate*}", "\\begin{enumerate*}",fixed = TRUE)
来完成此操作。
最佳答案
您可以在 Perl 中使用 -0
(数字零)开关来指定行分隔符。传统上使用 -0777
读取整个文件
您还需要注意搜索字符串中的正则表达式元字符。 *
、{
、}
和 \
等字符在正则表达式模式中表示特殊的含义,您应该转义它们- 通常使用 \Q
... \E
结构
考虑到这些要点,这应该适合您
perl -0777 -pe' s/\n+(?=\Q\begin{enumerate*}\E)/ / ' myfile
关于regex - 删除模式前的空行。怎么了?目前使用 Perl 但对 sed/AWK 开放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30057755/