【问题标题】:Using bash regexp to insert the contents of a file into another使用 bash 正则表达式将文件的内容插入到另一个文件中
【发布时间】:2012-06-09 19:58:57
【问题描述】:

我有一个带有 jquery 函数调用的 javascript 文件:

$.getScript('/scripts/files/file.js');

我想将该行替换为该路径中文件的内容。这是我目前拥有的 bash 脚本:

cat public/scripts/old.js | sed -e "s/$\.getScript\('(.)+'\);/$(cat \1)/g"  > public/scripts/new.js

但是,我的正则表达式和记住路径似乎无法正常工作。我得到cat: 1: No such file or directory ,好像cat 在数字1 上被调用(这应该是正则表达式的记忆部分)。我该如何解决这个问题?

【问题讨论】:

    标签: regex bash shell command-line terminal


    【解决方案1】:

    因为您在双引号内使用$(),所以shell 正在解析cat \1,剥离反斜杠并尝试运行cat 1 以将其输出作为参数的一部分传递给sed。 sed 有一个命令 (r) 用于读取文件,但文件名必须是文字,并且不能是以前的 sed 命令的结果(至少在标准 sed 中,也许某些实现提供了这种能力)。 sed 确实是错误的工具。你可以做一个 awk 解决方案,但它会很脆弱。

    这是一个可能的 perl 解决方案(警告:脆弱):

    perl -ne 'if( $_ =~ /\$\.getScript\('"'(.*)'"'\)/ ) 
       { system( "cat $1" ) } else {print}' public/scripts/old.js
    

    【讨论】:

    • 如果我改用单引号会怎样?并更改传递给getScript 的路径以使用双引号?
    • sed 没有存储字符串并将其用作文件名的机制。
    • 愚蠢的问题,perl 是 bash 命令、shell 还是在 bash shell 中实现的 perl 语言?
    • perl 是一个单独的命令。它是非标准的,但几乎无处不在。
    • Perl 是 Bash 在 PATH 中找到的可执行文件。在这种情况下,它也是一个将参数提供给 Bash 解释器的命令。与流行的看法相反,它不是不标准的;它目前是Linux Standard Base 的一部分。
    猜你喜欢
    • 2012-03-17
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多