我遇到过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
答案 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
兴趣点:
/
,但在这种情况下,选择:
是为了防止文件路径中/
的转义sed
表达式包含在'
中,以防止shell扩展变量。虽然在这种情况下不会发生任何扩展,但在'
中包含表达式以消除这种可能性是相当普遍的。