【问题标题】:add line at top and bottom of file before sending it to pipe在将文件发送到管道之前在文件的顶部和底部添加行
【发布时间】:2013-02-22 16:50:06
【问题描述】:

我有一个文本文件,比如text

我想做的是将文本文件放入管道中(如cat text |),但在顶部和底部添加了一行 - 但不创建新文件(因为text 文件有点大) 或修改它。

这可能吗?我在想echo $(echo "line"; cat text; echo "line"),但我不喜欢那样。

【问题讨论】:

  • 在 bash 中,单独的括号(没有第一个回声和$)应该可以工作。
  • 您也可以为多余的行创建一个文件,然后执行:cat first-line text

标签: linux bash


【解决方案1】:

来自 man bash:

(list) list 在子shell 环境中执行(参见下面的命令执行环境)。影响 shell 环境的变量分配和内置命令在命令完成后不会保持有效。 返回状态为list的退出状态。

所以这应该有效:

(echo first line; cat file; echo last line) | some_command

正如chepner 所建议的,当您不需要子shell 时,您可以使用{} 而不是()。在这种情况下,; 是强制性的,包括组中的最后一个命令。

在 cmets Pyrolistical 中,如果你有一个传入管道而不是文件,这也可以工作:

some_program | (echo first line; cat -; echo last line) | some-other-command

与许多 unix 命令行应用程序一样,如果 cat 的文件名参数是 -,则表示“从标准输入读取”。

【讨论】:

  • 你也可以在这里使用一个简单的命令组:{ echo first; cat file; echo last; } | some_command。不需要子shell
  • 我认为可能有比复杂的 sed 更简单的东西。谢谢!
  • @chepner:当我这样做时,文件似乎打印在 STDOUT 而不是管道上。
  • 如果您有传入管道,您可以some-program | (echo first line; cat -; echo last line) | some-other-command
  • @Pyrolistical 您应该将其添加为单独的答案以提高可见性。这就是我想要的,但我第一次阅读此页面时错过了它。
【解决方案2】:

复制自这个问题Add new lines to top and bottom of every text file

cat text |sed -e '1 i beginning_line'| sed -e '$s@$@\nending_line@' |

它似乎有效。

【讨论】:

    【解决方案3】:

    在管道输出中添加行, 在顶部添加一行:(来源 - @Karel Bilek 的评论)

    cat text.txt | sed -e '1 i my first line'
    

    在底部添加一行:( source - https://askubuntu.com/a/968585 )

    cat text.txt | sed -e '$a my last line'
    

    例如:用单引号试试这个

    cat text.txt | sed -e '1 i my first line' | sed -e '$a my last line'
    

    输出:

    my first line
    this is
    my
    text
    file
    my last line
    

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      相关资源
      最近更新 更多