regex - 删除模式前的空行。怎么了?目前使用 Perl 但对 sed/AWK 开放

标签 regex bash perl newline

在一份很长的文档中,我想有选择地删除确切字符串 \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/

相关文章:

javascript - 如何在 JavaScript 字符串替换中否定匹配正则表达式?

c# - 从 C# 的 Regex.Matches 返回的数组顺序是否保证按文本顺序排列?

perl - 如何在 Perl 中使用 LWP::UserAgent 获取 HTTP 响应的正文?

linux - 我正在尝试在 bash 中创建多行变量但面临错误 "unexpected EOF while looking for matching ` )' "

linux - 提取没有同名目录的文件

perl - 欢快的 : syntax-highlighting for inlined templates

regex - 如何使用正则表达式捕获特定字符串?

javascript - 如何使用 JavaScript 验证此表单上的邮政编码?

python - Python 正则表达式中可变宽度回顾的替代方案

为性能测试生成大量 ssl/tls 连接的 Bash 脚本