使用管道中的文件名进行sed

使用管道中的文件名进行sed,sed,pipe,ls,Sed,Pipe,Ls,在一个文件夹中,我有许多文件,文件名中有几个参数,例如(只有一个参数)file\u a1.0.txt,file\u a1.2.txt等 这些是由C++代码生成的,我需要把最后一个(在时间上)生成。我不知道当代码终止时这个参数的值是多少。之后,我需要复制最后一个文件的第二行 要复制任何文件的第二行,我知道这个sed命令可以工作: sed -n 2p filename 我还知道如何查找最后生成的文件: ls -rtl file_a*.txt | tail -1 问题: 如何将这两种操作结合起来?

在一个文件夹中,我有许多文件,文件名中有几个参数,例如(只有一个参数)
file\u a1.0.txt
file\u a1.2.txt

这些是由C++代码生成的,我需要把最后一个(在时间上)生成。我不知道当代码终止时这个参数的值是多少。之后,我需要复制最后一个文件的第二行

要复制任何文件的第二行,我知道这个
sed
命令可以工作:

sed -n 2p filename
我还知道如何查找最后生成的文件:

ls -rtl file_a*.txt | tail -1
问题: 如何将这两种操作结合起来?当然,可以将第二个操作通过管道传输到该sed操作,但我不知道如何将管道中的文件名作为sed命令的输入。

您可以使用这个

ls -rt1 file_a*.txt | tail -1 | xargs sed -n '2p'
(或)


通常,您可以将一个命令放在后面的记号中,以将其输出放在另一个命令的特定点上—因此

sed -n 2p `ls -rt name*.txt | tail -1 `
另一种选择是——而且是首选,因为它更容易嵌套等-

sed -n 2p $(ls -rt name*.txt | tail -1)

-ls中的r是相反的顺序

   -r, --reverse
          reverse order while sorting
但是当与
tail-1
一起使用时,这不是一个好主意

使用下面的更改(在ls中使用head-1而不使用r选项),性能会更好,您无需等待列出所有文件,然后再使用pipe-to-tail命令

sed -n 2p $(ls -t1 name*.txt | head -1 )

我正在寻找一个类似的解决方案:从一个grep结果管道中获取文件名,以提供给sed。我在这里复制了搜索和替换的答案,但是这个示例可能会有所帮助,因为它为管道中找到的每个名称调用sed:

此命令仅用于查找所有文件:

grep -i -l -r foo ./* 
要排除此_shell.sh(如果您将命令放在名为this_shell.sh的脚本中),请将输出输入到控制台以查看发生了什么,然后对找到的每个文件名使用sed将文本foo替换为bar:

grep -i -l -r --exclude "this_shell.sh" foo ./* | tee  /dev/fd/2 | while read -r x; do sed -b -i 's/foo/bar/gi' "$x"; done 
我选择了这种方法,因为我不喜欢更改未修改文件的所有时间戳。输入grep结果只允许查看带有目标文本的文件(因此可能也会提高性能/速度)

请确保在使用前备份文件并进行测试。在某些环境中,可能无法处理带有嵌入空间的文件。(?)


fwiw-我在使用tail方法时遇到了一些问题,似乎整个数据集是在仅对最后一项调用tail之前生成的。

它不起作用。给出一条以sed开头的长错误消息:无效选项--“w”我使用Ubuntu Linux。不,文件名没有空格。@Reza,应该可以。我在Ubuntu上测试过。很好用。对不起,我用不了。这正是从我的终端复制粘贴:ls-rtl paramp10.2 | tail-1 | xargs sed-n'2p'sed:invalid option--'w'用法:sed[option]。。。{仅当没有其他脚本时使用脚本}[输入文件]-n、 --quiet,--silent禁止自动打印图案空间-e script,-expression=script将脚本添加到要打印的命令中executed@Reza,
-l
将为您提供长列表输出。这就是为什么我使用了
ls-1(一)
grep -i -l -r --exclude "this_shell.sh" foo ./* | tee  /dev/fd/2 | while read -r x; do sed -b -i 's/foo/bar/gi' "$x"; done