【发布时间】:2011-09-18 04:07:06
【问题描述】:
我需要编写一个快速(到明天)过滤器脚本,用转义换行符\n 替换双引号字符串中的换行符(LF 或 CRLF)。内容是一个(损坏的)javascript 程序,所以我需要在字符串中允许像"ab\"cd" 和"ab\\"cd"ef" 这样的转义序列。
我知道 sed 不适合这项工作,因为它按行工作,所以我转向 perl,我对此一无所知 :)
我已经编写了这个正则表达式:"(((\\.)|[^"\\\n])*\n?)*" 并使用 http://regex.powertoy.org 对其进行了测试。它确实匹配带换行符的引用字符串,但是,perl -p -e 's/"(((\\.)|[^"\\\n])*(\n)?)*"/TEST/g' 不匹配。
所以我的问题是:
- 如何让 perl 匹配换行符?
- 如何编写“replace-by”部分,使其保留原始字符串并仅替换换行符?
similar question 有 awk 解决方案,但这不是我所需要的。
注意:我通常不会问“请为我做这件事”的问题,但我真的不想在明天之前学习 perl/awk...:)
编辑:样本数据
"abc\"def" - matches as one string
"abc\\"def"xy" - match "abcd\\" and "xy"
"ab
cd
ef" - is replaced by "ab\ncd\nef"
【问题讨论】:
-
双引号字符串在什么上下文中?
-
好吧,javascript,但我认为这无关紧要。我不需要完全解析,只需要识别字符串文字
-
"Handling"
\"和\\"可能意味着您期望字符串被扩展两次。或者您想保留恰好位于结束"之前的反斜杠。由于除了“正确处理”之外您没有提供任何所需的输出,我只能猜测“正确”对您意味着什么。 -
@davka,你能发布示例内容来试试吗?谢谢
-
@TLP,@Joel,我明白了,会编辑
标签: regex linux perl scripting awk