我的个人资料中有以下内容:
export JAVA_HOME=/usr/bin/java
如何评论此行并在此行后添加新行。
预期结果:
#export JAVA_HOME=/usr/bin/java
export JAVA_HOME=${java_path}
我试过这个
我尝试使用以下sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt
仅在评论不存在的情况下添加评论,但这不是
提前致谢
答案 0 :(得分:1)
尝试以下操作(假设 GNU Sed ):
sed -r '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\n\1${java_path}/}' file.txt
使用 BSD(OSX) Sed (也应该使用GNU Sed),事情会变得复杂一些(假设bash
,{{1} }或ksh
作为shell,由于使用了zsh
,ANSI C-quoted string来生成文字换行符。):
$'\n'
(希望)符合POSIX标准的解决方案(但有点复杂;还假设sed -E '\|^(export JAVA_HOME=)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt
,bash
或ksh
作为shell):
zsh
正如您所看到的,不同的sed '\|^\(export JAVA_HOME=\)/usr/bin/java$| {s//#&\'$'\n''\1${java_path}/;}' file.txt
实现需要不同的解决方案,因此,特别是对于sed
和sed
,但是对于一般的Unix实用程序,建议提及一个平台或明确请求跨平台兼容的解决方案。
注意:通常,awk
用于在Sed命令中分隔正则表达式,但是可以选择不同的分隔符,如果您想避免必须转义/.../
个字符,这将非常有用。在正则表达式本身。在这里,我选择了/
- 请注意开头 |
必须|
- 转义(您不为\
)选择备用分隔符时要做的事。
至于为什么你的命令,s///
,无效:
你忽略了逃离sed -e '/export JAVA_HOME=/usr/bin/java/ s/^#*/#/' < file.txt
字符。在正则表达式/
中,这是必要的,因为您的Sed地址使用\/
作为正则表达式分隔符。
/
在匹配的行中查找零个或多个现有的 s/^#*/#/
个字符,并在给定的情况下仅用#
替换它们,一个无操作。
#
函数隐式操作上下文地址(选择匹配行的脚本开头的正则表达式)匹配,则必须使用 emtpy 正则表达式,即s
,如上述解决方案。s//.../
;如果有捕获组,如上面的解决方案,你可以参考他们通过索引捕获的内容:&
指的是第一组,...