以下内容直接在我的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 字段分隔符中