首页 > 解决方案 > 读取输入参数并使用 xargs 传递给 sed

问题描述

我有两个文件,文件 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");
}

标签: bashunixsedxargs

解决方案


下面的代码应该实现你所需要的,虽然我没有完全理解你想要实现的语义,因为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");
}

上面的 Mind 使用 GNU sed,如果你使用的是 macosx,你需要在gsed那里使用。


推荐阅读