【问题标题】:Read input param and passs to sed with xargs读取输入参数并使用 xargs 传递给 sed
【发布时间】:2021-10-06 06:27:21
【问题描述】:

我有两个文件,文件 1 和文件 2:我想在每个函数的开头添加一个日志,以了解它是从哪个文件执行的:

文件 1:

function one(){
}

function two(){
}

文件2

function one(){
}

function two(){
}

我正在尝试列出文件,使用xargs 将文件发送到sed 以查找模式并在匹配后添加日志

ls  file*  | xargs sed  '/function /a $.log("File");'

输出:

function one(){
$.log("File");
}

function two(){
$.log("File");
}

function one(){
$.log("File");
}

function two(){
$.log("File");
}

现在我需要在sed 中使用文件名作为变量,但在查看xargs --helpsed --help 时,我不知道如何解决这个问题。

是否有对sed 正在处理的文件的引用可以在命令中使用?类似的东西

ls  file*  | xargs sed  '/function /a $.log("$INPUT_REFERENCE");'

预期输出:

function one(){
$.log("File1");
}

function two(){
$.log("File1");
}
function one(){
$.log("File2");
}

function two(){
$.log("File2");
}

【问题讨论】:

    标签: bash unix sed xargs


    【解决方案1】:

    如果您愿意使用awk

    awk '
    1                                                 # print current line
    $1=="function" { print "$.log(\""FILENAME"\");"   # print a $.log() line
    }' File*
    

    或者作为单行:

    awk '1;$1=="function"{print "$.log(\""FILENAME"\");"}' File*
    

    这将为 2 个示例文件生成以下内容:

    function one(){
    $.log("File1");
    }
    
    function two(){
    $.log("File1");
    }
    function one(){
    $.log("File2");
    }
    
    function two(){
    $.log("File2");
    }
    

    【讨论】:

    • 忘了说需要保存修改,把原文件替换成带日志的文件。您为 Awk 提供的命令正是我想要的,但要更新文件,在我看来我需要 gawk。
    • 是的,您可以使用-i inplace,但(我认为)该选项目前仅在GNU awk(又名gawk)中受支持
    • gawk -i inplace '1;$1=="function"{print "$.log(\""FILENAME"\");"}' file* 符合预期,谢谢。
    【解决方案2】:

    下面的代码应该实现你所需要的,虽然我没有完全理解你想要实现的语义,因为function foo() 代码将被它的下一个声明覆盖(在同一个文件中)。 你要找的是xargs的-I <string>

    $ cat foo.sh
    function one(){
    }
    
    function two(){
    }
    
    $ touch File{1..2}
    
    $ ls File* | xargs -I@ sed $'/function /a\$.log("@");' foo.sh
    function one(){
    $.log("File1");
    }
    
    function two(){
    $.log("File1");
    }
    
    function one(){
    $.log("File2");
    }
    
    function two(){
    $.log("File2");
    }
    

    以上使用 GNU sed,如果您使用的是 macosx,则需要在此处使用 gsed

    【讨论】:

    • 应该能够通过将sed ... foo.sh 替换为sed ... @ 来读取实际文件(在OP 的情况下为File1File2
    • 我正在尝试修改数百个文件,为文件中的每个函数添加一个带有文件名的日志。我糟糕地举例说明了这个问题。但是这两个答案肯定会帮助我解决问题。
    【解决方案3】:

    这可能对你有用(GNU sed 和并行):

    parallel sed -i ''/function/a$.log("{}");'\' {} ::: file[12]
    

    就地更新file1file2,在单词function 后面附加一行。

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 2017-12-24
      • 2017-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2019-10-05
      相关资源
      最近更新 更多