Linux

sed + 如何告訴 sed 在行已經存在時忽略附加?

  • May 10, 2021

我們想在匹配詞之前添加以下行 -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 單行)

一種選擇是使用以下方法清理線路:

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 行中做到這一點

我將簡化並將您的 exec 行稱為“exec”和前置行(帶有導出)“pre1”和“pre2”。

您可以通過將 /pre1/ 上的兩行載入到保留空間中來“跳過”兩行並執行“空”命令b

sed '/pre1/{N;N;b};/exec/ipre1\npre2'

這樣,for 命令/exec/僅在/pre1/不匹配時執行。

當然假設你有

pre1
pre2
exec

要不就

exec

只有並且永遠不會以其他順序“pre1”或“pre2”,只有其中一個,或文件中其他位置的任何一個。

引用自:https://unix.stackexchange.com/questions/649021