Perl 命令适用于命令行,但不适用于 bash 脚本

用户7417

在较大的 bash 脚本中,我使用一行带有 perl 命令的行将文本文件中的时间戳替换为当前日期和时间。我使用以下几行:

perlcmd="perl -i -pe 's/2005-03-31T19:13:30/$(date +"%Y-%m-%dT%H:%M:%S")/' ./file.txt"
echo $perlcmd
$perlcmd

echo 命令显示 perl 命令没问题,它的输出是:

perl -i -pe 's/2005-03-31T19:13:30/2017-12-21T11:33:44/' ./file.txt

但是,不会替换时间戳。当我将回显的行粘贴到命令行时,它会正确执行并替换时间戳。如何更改 bash 脚本中的代码以使其工作?

纳维尔·福耶尔

因为 prelcmd 变量中的单引号按字面解释而不是语法解释(因为 shell 命令行处理不是特定于 bash 但posix shell引用是在参数扩展之前),最简单的方法是使用数组:

perlcmd=(perl -i -pe 's/2005-03-31T19:13:30/'"$(date +"%Y-%m-%dT%H:%M:%S")"'/' ./file.txt)
echo "${perlcmd[*]}"
"${perlcmd[@]}"

另一个解决方案是使用重新解释 perlcmd eval

perlcmd="perl -i -pe 's/2005-03-31T19:13:30/$(date +"%Y-%m-%dT%H:%M:%S")/' ./file.txt"
echo "$perlcmd"
eval "$perlcmd"

以下评论:如果$NewTitle可能包含任何字符,包括/,perl 代码将中断或代码可以注入。为了避免这个问题,数据可以通过参数或环境传递,如果数据可以在正则表达式模式中使用并且可以包含元字符,它可以被引用\Q.. \E

按参数:

perl -i -pe 'BEGIN{$old=shift@ARGV;$new=shift@ARGV}s/\Q$old\E/$new/' "$old_title" "$new_title" ./file.txt

按环境:

old_title=$old_title new_title=$new_title perl -i -pe 's/\Q$ENV{old_title}\E/$ENV{new_title}/' ./file.txt

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Bash在命令行上工作,但不在Perl脚本中工作

AWS CLI命令可在Bash上运行,但不适用于PHP shell_exec()

脚本适用于文件输入,但不适用于stdin

tcsh脚本中设置的环境变量不适用于bash脚本

googlemaps api适用于python终端,但不适用于脚本

适用于AWS的bash脚本假定角色

为什么bash brace扩展不适用于命令?

Chomp不适用于Perl脚本

从bash脚本调用Python不适用于XFCE键盘快捷键

Perl脚本中的Bash命令

适用于Python的Perl的Linux命令

SQL脚本适用于SQL Fiddle,但不适用于MS SQL Server 2014

bash脚本中的rm命令不适用于变量

超时不适用于bash脚本中的累计外壳

Bash重定向不适用于SQLite命令

@reboot适用于命令,但不适用于脚本-Cron

使用perl的prepare命令不适用于DBI

bash脚本–适用于{x..y}中的i

me.level 适用于提示但不适用于脚本

函数适用于命令行,但不适用于脚本

如果那么 bash 语句不适用于 qiime 命令

用于将文件分成目录、反向排序和打印 HTML 文件的 Bash 脚本适用于某些文件但不适用于其他文件

适用于 PHP 但不适用于脚本

使用 powershell 读取文本文件仅适用于 powershell 屏幕命令,而不适用于脚本

命令替换不适用于 Bash 中的“test”或“[”或“[[”

Expect 脚本中的 scp 适用于少数文件但不适用于许多文件

Bash 命令适用于 Mac OS,但不适用于 Ubuntu 20.4

适用于 Windows 和 Mac 的 Bash 脚本

命令行参数不适用于 Bash 中的“grep”命令