【问题标题】:sed with filename from pipesed 使用管道中的文件名
【发布时间】:2014-03-18 05:10:15
【问题描述】:

在一个文件夹中,我有许多文件,文件名中有多个参数,例如(只有一个参数)file_a1.0.txtfile_a1.2.txt 等。
这些是由 c++ 代码生成的,我需要(及时)生成最后一个。我不知道当代码终止时这个参数的值是什么。之后,我需要复制最后一个文件的第二行。

要复制任何文件的第二行,我知道这个sed 命令有效:

sed -n 2p filename

我也知道如何找到最后生成的文件:

ls -rtl file_a*.txt | tail -1

问题:

如何结合这两个操作?当然可以通过管道将第二个操作传递给该 sed 操作,但我不知道如何将管道中的文件名作为该 sed 命令的输入。

【问题讨论】:

    标签: sed pipe ls


    【解决方案1】:

    你可以用这个,

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

    (或)

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

    【讨论】:

    • 它不起作用。给出一个以 sed: invalid option -- 'w' 开头的长错误信息
    • 我使用 Ubuntu Linux。不,文件名没有空格。
    • @Reza,它应该可以工作。我在 Ubuntu 中测试过。它运行良好。
    • 对不起,但这对我不起作用。这正是从我的终端复制粘贴: ls -rtl parampump10.2 |尾-1 | xargs sed -n '2p' sed: 无效选项 -- 'w' 用法: sed [OPTION]... {script-only-if-no-other-script} [input-file]... -n, - -quiet, --silent 禁止自动打印模式空间 -e script, --expression=script 将脚本添加到要执行的命令中
    • @Reza, -l 将为您提供长列表输出。这就是为什么,我使用ls -1 (one)
    【解决方案2】:

    通常,您可以将命令放在反引号中,以将其输出放在另一个命令中的特定点 - 所以

    sed -n 2p `ls -rt name*.txt | tail -1 `
    

    替代 - 和首选,因为它更容易嵌套等 -

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

    【讨论】:

      【解决方案3】:
      ls 中的

      -r 是相反的顺序。

         -r, --reverse
                reverse order while sorting
      

      但是和tail -1一起使用就不是个好主意了。

      通过以下更改(在 ls 中没有 r 选项的 head -1),性能会更好,您无需等待列出所有文件然后管道到 tail 命令

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

      【讨论】:

        【解决方案4】:

        我一直在寻找类似的解决方案:从 grep 结果管道中获取文件名以提供给 sed。我已经在此处复制了我的答案以进行搜索和替换,但也许这个示例可以提供帮助,因为它为管道中找到的每个名称调用 sed:

        这个命令可以简单地查找所有文件:

        grep -i -l -r foo ./* 
        

        this 排除 this_shell.sh(如果您将命令放在名为 this_shell.sh 的脚本中),将输出发送到控制台以查看发生了什么,然后对每个使用 sed找到用 bar 替换文本 foo 的文件名:

        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 之前生成的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          • 2015-12-14
          • 2014-12-21
          • 1970-01-01
          • 1970-01-01
          • 2014-08-31
          • 2017-04-23
          相关资源
          最近更新 更多