sed用法无法理解

时间:2016-12-07 05:07:55

标签: unix sed

我遇到过unix sed命令用法而无法理解它的作用。你能帮我理解一下用法吗?如果可能的话,请分享一些参考,以了解sed命令的这种用法。

sed -i '/^export JAVA_HOME/ s:.*:export JAVA_HOME=/usr/java/default\nexport HADOOP_PREFIX=/usr/local/hadoop\nexport HADOOP_HOME=/usr/local/hadoop\n:' $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh

2 个答案:

答案 0 :(得分:3)

该命令很简单,但它假设GNU sed,因为它使用-i选项的方式;对于macOS Sierra和相关系统,您需要使用-i ''代替-i

总的来说,它对应于:

sed -i '/Pattern/ s:.*:Replacement:' file

其中:

  • -i表示使用已编辑的输出覆盖每个输入文件,而不创建备份副本。

  • /Pattern/^export JAVA_HOME;一行以单词export开头,然后JAVA_HOME以单个空格分隔。

  • s:.*:Replacement:是替换命令,使用:代替更传统的/(通常为s/.*/Replacement/)作为模式分隔符。这样做是因为替换文本包含斜杠。 .*匹配整行。编写其余材料代替原始export JAVA_HOME行。 \n序列扩展为换行符,因此它实际上会在输出中生成多行。

  • file$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh

答案 1 :(得分:1)

正如其他人所指出的,这是一个sed命令调用。该命令是" Stream EDitor"的缩写。并且对于以编程方式修改文件非常有用。您最好的选择是阅读手册页(man sed,但我出于指导目的打破了您的特定命令:

sed                                     # The command
-i                                      # Edit file in place (no backup)
'/^export JAVA_HOME/                    # For every line that begins with 'export JAVA_HOME'...
s:                                      # substitue...
.*:                                     # the entire line with...
export JAVA_HOME=/usr/java/default
export HADOOP_PREFIX=/usr/local/hadoop
export HADOOP_HOME=/usr/local/hadoop
:'                                      # End of command
$HADOOP_PREFIX/etc/hadoop/hadoop-env.sh # Run on the following file

兴趣点:

  • 命令可以限制在特定的地址范围或范围内。这里的范围是搜索。
  • substitue命令几乎可以由任何字符分隔(通常是/,但在这种情况下,选择:是为了防止文件路径中/的转义
  • sed表达式包含在'中,以防止shell扩展变量。虽然在这种情况下不会发生任何扩展,但在'中包含表达式以消除这种可能性是相当普遍的。