读取输入参数并使用 xargs 传递给 sed

Read input param and passs to sed with xargs

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

如果您愿意使用 awk:

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

或者单行:

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

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

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

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

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

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

这可能适合您(GNU sed 和并行):

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

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