【问题标题】:Why is my carriage return not working in my perl script?为什么我的回车在我的 perl 脚本中不起作用?
【发布时间】:2015-07-17 01:41:05
【问题描述】:

从 sed 进入 perl 我正在尝试在 CSS 文件上进行练习,但我遇到了问题,并且我没有从多次搜索中找到问题所在。在我的 bash 脚本中,我的目标是一个 CSS 文件:

.thisclass
{   font-family: "Times New Roman";
    line-height: 1.20em;
    font-size: 1.00em;
    margin: .25em 0;
    color: rgb(0,0,0);
}

我的目标是:

.thisclass {    
    font-family: "Times New Roman";
    line-height: 1.20em;
    font-size: 1.00em;
    margin: .25em 0;
    color: rgb(0,0,0);
}

我尝试的 perl 是 perl -pe 's:\r^{: {\r:g',但它不起作用。如果我尝试:

perl -pe 's:^{:foobar:g'

输出是:

.thisclass
foobar  font-family: "Times New Roman";
    line-height: 1.20em;
    font-size: 1.00em;
    margin: .25em 0;
    color: rgb(0,0,0);
}

如果我尝试perl -pe 's:\r:foobar:g',整个文档都会被foobar修改

在我的文本编辑器中我可以执行\r^{,在我的终端中我可以执行s/\n{/ {\n/g;,但我无法通过sh foo.sh 的脚本在perl 中执行回车或换行。我试过使用\s(空白字符相当于[\t\n\r\f])但没有成功。

那么为什么回车在我的 perl 中不起作用?有没有更好的方法来执行我想做的事情?如果有更好的方法,请解释原因。

【问题讨论】:

  • ^ 在比赛中间与您期望的方式不匹配,但您不需要它。您刚刚断言(使用\r)您处于新行的开头。只需从第一次尝试中删除它,看看是否有效。
  • 您确定要使用“\r”而不是“\n”吗? Apple 在几年前切换到 OS X 时切换了它的首选行。事实上,您显示的输出看起来像是“成功”(?)的经典示例,插入了可怕的“\r”字符并让它覆盖以前的字符上线了....
  • 我已经尝试过\r\n,但都不能在脚本中工作,但在文本编辑器中工作。删除^ 后仍不能解决问题。

标签: regex macos bash perl


【解决方案1】:

您正在逐行读取文件,因此每一行都以回车符或换行符结尾——后面没有任何内容。 \r{ 不会出现在任何一行。

您可以使用-0777 开关来启用 slurp 模式并将整个文件作为字符串读取:

perl -0777 -pe 's/\R{/ {\n /g' foo.css

\R 应该匹配任何类型的换行符,无论是 \r\n\r 还是 \n

【讨论】:

  • 要读取整个文件,需要-0777,而不是-00。固定的。 (-00 也可以在这里使用,因此另一种解决方案是更改解释。)
  • 哦,对了。 00 参数用于 paragraph 模式,我很幸运能在这里工作。我的识字失败。谢谢!
猜你喜欢
  • 2010-11-16
  • 2022-01-17
  • 2016-11-03
  • 2012-10-07
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多