【问题标题】:How do I let sed 'w' command know where the filename ends?如何让 sed 'w' 命令知道文件名的结尾?
【发布时间】:2012-06-24 21:47:46
【问题描述】:

我能找到的每个演示sedw 命令的示例都在脚本末尾有它。如果我做不到怎么办?

一个例子可能会更好地说明这个问题:

$ echo '123' | sed 'w tempfile; s/[0-9]/\./g'
sed: couldn't open file tempfile; s/[0-9]/\./g: No such file or directory

(如何)我可以更改以上内容,以便sed 知道文件名的结尾吗?

附:我知道我可以做到

$ echo '123' | sed 'w tempfile
> s/[0-9]/\./g'
...

有更漂亮的选择吗?

附言人们倾向于建议将其拆分为两个脚本。那么问题来了:它安全吗?如果我要在 w 命令之后的某个地方分支,等等。有人可以确认 any 脚本可以在 any 命令之后一分为二并且不会影响结果吗?

最终编辑:我检查了多个 -e 是否可以像串联命令一样工作。我认为它更复杂(比如第一个应该总是在第二个开始之前退出,等等)。但是,我尝试在两个脚本之间拆分 {..} 的命令块,它仍然有效,所以 w 的事情真的不是一个严重的问题。谢谢大家。

【问题讨论】:

  • 你为什么不把它拆分成多个命令,比如echo '123' | sed -e 'w tempfile' -e 's/[0-9]/\./g'。这不是你想要的吗?
  • @Celada 实际情况更复杂,一切都在递归“标签”内;也许我仍然可以以某种方式拆分它,但这可能具有挑战性,而且我不确定它是否总是可以完成。

标签: file bash unix sed


【解决方案1】:

您可以在一个 shell 行中为 sed 提供两行脚本:

echo '123' | sed -e 'w tempfile' -e 's/[0-9]/\./g'

【讨论】:

  • 它是作为两行脚本工作还是作为两个脚本工作?我可以像这样在不破坏逻辑的情况下将脚本一分为二吗?
  • 如果你在这个命令之后cat tempfile,它仍然显示123
  • @anubhava 正如我在上面所写的,我担心涉及流控制的更复杂的情况。所以我很好奇它是否可以一直完成,而不仅仅是这个简单的命令。
【解决方案2】:

这可能对你有用(如果你使用 BASH 并且可能是 GNU sed):

echo '123' | sed 'w tempfile'$'\n'';s/[0-9]/\./g'

解释:

rRw 命令需要换行符来终止文件名。

【讨论】:

    【解决方案3】:

    问题的答案是“换行符”:

    sed 会将未转义的文字换行符视为文件名的结尾。

    如果你的 shell 是 bash,或者支持 $'\n' 语法,你可以这样解决 OP 的原始问题:

    echo '123' | sed 'w tempfile'$'\n''s/[0-9]/\./g'
    

    在更有限的sh你可以说

    $ echo '123' | sed 'w tempfile'\
    > 's/[0-9]/\./g'
    

    我在这里所做的是写\ 作为转义,然后按回车并在那里写下命令的其余部分。请注意,这里我从bash 转义换行符,但它被传递给sed

    【讨论】:

      【解决方案4】:

      像这样反转 2 个 sed 命令序列:

      echo '123' | sed 's/[0-9]/\./g;w tempfile'
      

      即先执行替换,然后将模式空间写入文件。

      编辑: OP 是否希望在最终文件中替换文本存在一些误解。我上面的命令将替换的文本放在临时文件中。由于这不是 OP 想要的,因此还有一个版本可以避免它:

      echo '123' | sed -e 'h;s/[0-9]/\./g;g;w tempfile'
      

      【讨论】:

      • @LevLevitsky:请看我编辑的答案,它可以在单个 sed 命令中完成,而无需将其分成 2 个。
      • 该订单是预定的。抱歉,我的例子一定有误导性。
      • 啊,我以为你也想在 tempfile 中替换结果。
      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 2011-12-05
      • 2014-08-31
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2017-05-29
      • 2012-04-30
      相关资源
      最近更新 更多