exec
我们想在启动器文件中的匹配词之前添加以下几行
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
export PATH=$PATH:$JAVA_HOME/bin
启动器文件
more launcher
.
.
.
exec "$(dirname "$0")/launcher.py" "$@"
所以我们创建以下 sed 行
sed -i '/^exec/i export JAVA_HOME=/usr/jdk64/jdk1.8.0_112\nPATH=${JAVA_HOME}/bin:$PATH' launcher
问题是,当我们第二次或第三次运行上面的 sed 行时,sed 会追加新行,因此我们会得到重复的行,如下所示
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
PATH=${JAVA_HOME}/bin:$PATH
export JAVA_HOME=/usr/jdk64/jdk1.8.0_112
PATH=${JAVA_HOME}/bin:$PATH
exec "$(dirname "$0")/launcher.py" "$@"
当行已经存在时,是否可以告诉 sed 忽略附加? ,(或使用 Perl Oneliner )
一种选择是使用以下方法清洁线路:
sed -i '/JAVA_HOME/d' launcher
进而
sed -i '/^exec/i export JAVA_HOME=/usr/jdk64/jdk1.8.0_112\nPATH=${JAVA_HOME}/bin:$PATH' launcher
但也想知道我们是否可以在上面的 sed 行中执行此操作
答案1
我将简化并将您的执行行称为“exec”,并将前置行(带有导出)称为“pre1”和“pre2”。
您可以通过将 /pre1/ 上的两行加载到保留空间中来“跳过”它们并执行“空”命令b
:
sed '/pre1/{N;N;b};/exec/ipre1\npre2'
这样,仅当不匹配/exec/
时才运行命令。/pre1/
当然假设你有
pre1
pre2
exec
要不就
exec
仅且绝不以其他顺序显示“pre1”或“pre2”,仅其中之一,或文件中其他位置的任何一个。