在 Ruby awk 系统命令中转义正则表达式



以下内容直接在我的Mac OS X终端中工作,创建一个包含几行的文件:

awk '!/^1499||^1598||^1599||^1999||^2298||^2299||^2403|/' "#{working_path}" > "#{filtered_file_path}"

但是,当我尝试使用反引号在Ruby on Rails中使用它时,生成的文件为空:

`awk '!/^1499||^1598||^1599||^1999||^2298||^2299||^2403|/' "#{working_path}" > "#{filtered_file_path}"`

带有简单正则表达式的awk工作。例如:

`awk '!/SMITH/' "#{working_path}" > "#{filtered_file_path}"`

因此,问题似乎出在转义的管道字符上。

想法?


我应该提供一些背景:

我正在处理的文件是竖线分隔的。我正在过滤掉该行第一个值中带有某些代码的行。所以,我正在使用的正则表达式类似于 ^2298| .

表达式中的单引号中的其他管道是正则表达式 OR 运算符。

"working_path"和"filtered_file_path"是 Ruby 变量。

我刚刚想通了。转义管道字符的反斜杠也需要转义。不知道为什么常规终端和 Ruby 之间存在差异,但确实如此。工作版本:

`awk '!/^1499\||^1598\||^1599\||^1999\||^2298\||^2299\||^2403\|/' "#{working_path}" > "#{filtered_file_path}"`

挑战了我关于问题出在Ruby on Rails的假设之后,这里公认的答案是解释它的:管道符号 |在 AWK 字段分隔符中

最新更新