读取输入参数并使用 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 --help
和 sed --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]
就地更新 file1
和 file2
,在单词 function
后添加一行。
我有两个文件,文件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 --help
和 sed --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]
就地更新 file1
和 file2
,在单词 function
后添加一行。