sed + 如何告诉 sed 当行已存在时忽略附加?

sed + 如何告诉 sed 当行已存在时忽略附加?

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”,仅其中之一,或文件中其他位置的任何一个。

相关内容