【发布时间】:2012-01-31 15:20:29
【问题描述】:
如何使用 perl 搜索两个连续的换行符 (\n)?或者更具体地说,为什么对 \n\n 的搜索即使存在也不成功?我有一个带有连续换行符的文件(用十六进制编辑器验证,它们不是返回等),但 perl 似乎不接受这个正则表达式。
perl -pi -e 's/\n\n/TEST/g' myfile.xml = 没有结果
我实际上是在尝试在 XML 文件中插入一些代码,但换行符在中间,这样做最优雅的方式是什么?我想出了一个可怕的 perl 单行,但双换行似乎导致了失败。
我想从以下位置更改 gtkrc 文件的一部分:
GtkWidget::link-color = @link_color
GtkWidget::visited-link-color = @text_color
####################
# Color Definitions
####################
到:
GtkWidget::link-color = @link_color
GtkWidget::visited-link-color = @text_color
GtkWindow::resize-grip-height = 0
GtkWindow::resize-grip-width = 0
####################
# Color Definitions
####################
使用原始代码的一部分作为我的搜索词(在原始脚本的每一行之前都有标签,顺便说一句),我的查找和替换词是:
color\n\n\t\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\n\t\# Color
color\n\n\tGtkWindow::resize-grip-height = 0\n\tGtkWindow::resize-grip-width = 0\n\n\t\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\n\t\# Color
我想出了这个又大又丑的 perl 命令:
perl -pi -e 's/color\n\n\t\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\n\t\# Color/color\n\n\tGtkWindow::resize-grip-height = 0\n\tGtkWindow::resize-grip-width = 0\n\n\t\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\n\t\# Color/g' /usr/share/themes/Ambiance/gtk-2.0/gtkrc
编辑:来自 Zaid 的更正代码:
perl -0777 -pi -e 's/color\n\n\t\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\n\t\# Color/color\n\n\tGtkWindow::resize-grip-height = 0\n\tGtkWindow::resize-grip-width = 0\n\n\t\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\#\n\t\# Color/g' /usr/share/themes/Ambiance/gtk-2.0/gtkrc
如前所述,似乎是 \n\n 会导致问题,因为其他任何东西都可以替换。有什么更好的方法来做到这一点?
我在 Ubuntu 11.10 上,命令将从 shell 脚本而不是 perl 脚本运行。
【问题讨论】: