Perl单线程中的交叉线正则表达式匹配

时间:2016-07-25 07:04:41

标签: regex perl

我的问题听起来微不足道,但我谷歌很多页面仍然无法找到答案。

我在Windows上。我有一个文本文件。如果我用Notepad ++打开它,它看起来像这个

enter image description here

我想尝试几件事

  1. 删除所有回车和换行

    perl -i.bak -pe "s/\r\n//g" a.txt

  2. 令人惊讶的是,没有任何改变。怎么了?但根据doc,我非常确定\rCR\nLF

    1. 我真正想做的是跨线匹配。例如,^function.*\r\n!将匹配就像Notepad ++将
    2. 一样

      enter image description here

      如果我们要缩进了!如果它的前一行以" function"开头,则会有一个天真的想法(实际上它的工作原理是记事本++)

      perl -i.bak -pe "s/^(function.*\r\n)!/$1\t!/g" a.txt
      

      但它没有用。如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

默认情况下,在Windows上,CR + LF在读取时转换为LF,LF在写入时转换为CR + LF。这使得线条看起来像是无论操作系统是否已经LF终止。

如果您想要将引导标签添加到以!开头的行。

perl -i.bak -pe"s/^!/\t!/" a.txt
   -or-
perl -i.bak -pe"s/^(?=!)/\t/" a.txt

你可能也试图避免在第一行上这样做。

perl -i.bak -pe"s/^!/\t!/ if $. > 1" a.txt
   -or-
perl -i.bak -pe"s/^(?=!)/\t/ if $. > 1" a.txt

答案 1 :(得分:2)

  1. with open("nea.json",'a+') as fs: for area in soup.find('weatherForecast').find_all('area'): fs.write(str(area.attrs))
  2. 即。只需将perl -i.bak -pe "s/\n//" a.txt更改为\r\n\n就会自动转换为Windows上的\r\n,因为ikegami会对此进行解释。

    1. \n
    2. 这里的要点是你需要将整个文件内容读入一个字符串才能进行跨行匹配。 perl -i.bak -0777 -pe "s/^(function.*?\n)!/\1\t!/gm" a.txt参数指示Perl执行此操作(或者您可以将-0777设置为Perl脚本中的空字符串。)