【问题标题】:bash - How to pass a line feed to perl from within a bash script? [duplicate]bash - 如何在 bash 脚本中将换行符传递给 perl? [复制]
【发布时间】:2016-07-29 02:19:29
【问题描述】:

我正在尝试替换所有数字序列,后跟换行符和字母a。这些数字序列位于名为test.txt 的文件中。 bash 脚本command.sh 用于执行任务(见下文)。

test.txt

00
a1
b2
a

command.sh

#!/bin/bash

MY_VAR="\d+
a"

grep -P "^.+$" test.txt | perl -pe "s/$MY_VAR/D/";

当我调用command.sh 文件时,我看到的是:

$ ./command
00
a1
b2
a

但是,我期待这个输出:

$ ./command
D1
bD

我错过了什么?

【问题讨论】:

标签: regex linux bash perl linefeed


【解决方案1】:

你甚至不需要grep,因为它只是匹配.+,只需使用perl-0777 选项(slurp 模式)来匹配跨行:

#!/bin/bash

MY_VAR="\d+
a"

perl -0777pe "s/$MY_VAR/D/g" test.txt

输出:

D1
bD

【讨论】:

  • 技术上,-0777 是 slurp 模式(-0 在空字节上拆分)。在这种情况下没有什么区别,但在其他(当然很少见)情况下可以。
  • 是的,-0 将文件按 null 分割
  • 不使用grep 是一个很好的提示。但是,它引入了在新问题中恢复的新问题。你介意看看吗? stackoverflow.com/q/38656531/363573
  • 注意:bash 不会将变量传递给 perl,而是使用换行符生成 perl 命令,如果变量包含/(正则表达式分隔符),则可以进行注入,更安全的解决方案是通过环境或参数传递
猜你喜欢
  • 2015-02-05
  • 2016-08-16
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多