【问题标题】:What is this command doing? sed这个命令在做什么? sed
【发布时间】:2015-06-09 21:38:11
【问题描述】:

我得到了一组通用命令,用作我必须执行的操作的示例:

1 cat /etc/dsh/machines.list | sed -e "s|\(.*\)|sshfs \1:/opt/dextor/cloud \1|"
2 cat /etc/dsh/machines.list | sed -e "s|\(.*\)|sshfs \1:/opt/dextor/cloud \1|" | sh
3 cat /etc/dsh/machines.list | sed -e "s|\(.*\)|cp run.sh \1/|" 
4 cat /etc/dsh/machines.list | sed -e "s|\(.*\)|cp run.sh \1/|" | sh

这到底是做什么的?

我知道 machine.list 的内容正在传递给 sed,但 sed 命令在做什么?

谢谢!

【问题讨论】:

  • 只需将/etc/dsh/machines.list 的每一行包装到这些命令中,并将\1 替换为每一行的内容。我不得不说这是一种非常奇怪的做事方式。
  • 更好的 sed 命令方式是 sed "s|^.*$|sshfs &:/opt/dextor/cloud &|"
  • @josifoski 最好不要使用 sed。
  • 这是对反向引用表示法的不必要使用(\n,其中 n 是单个数字)在这种情况下,替换命令左侧的整个模式都用于右手边。 & 是在这种情况下使用的正确元字符。
  • @josifoski s|.*|sshfs &:/opt/dextor/cloud &|,如果你选择.*,则不需要^$

标签: linux bash command-line sed


【解决方案1】:

我会向你解释cat /etc/dsh/machines.list | sed -e "s|\(.*\)|cp run.sh \1/|",其余的都是一样的。

1) cat 将从 machines.list 读取行并将其传递给 sed。

2) sed 基本上是在执行match and replace 操作。

|用作分隔符,可以是任意字符,一般为/。它基本上像这样|match this|replace with this| 工作。

您正在匹配 \(.*\),这基本上是告诉 sed 匹配所有内容。 . 匹配每个字符,* 表示匹配该字符任意次数。 使用() 会将匹配保存在\1 中。

在替换部分,您将替换为文本 cp run.sh \1/\1 将包含匹配的任何内容。

我也认为根本没有必要使用cat。最好这样用sed -e "s|\(.*\)|cp run.sh \1/|" /etc/dsh/machines.list

【讨论】:

  • 看看 cat 没用。更不用说其他怪人了。
  • 好的,谢谢你的解释。你有什么想法为什么例如第 1 行和第 2 行除了最后一个管道之外基本相同吗?还有为什么 |(.*)| 前面有一个“s”?
  • @ProgrammedChem line 1 只会在屏幕上给出输出,而line 2 会将该输出发送到 shell 以作为命令执行。为什么两条线都在那里,你应该问给你这些命令的人。在我看来,line1 会告诉你要执行什么,line2 会执行那个。可能只是为了让事情变得更好。 s 之前的 |(.*)|search and replace 的缩写。