Linux
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 單行)
一種選擇是使用以下方法清理線路:
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”,只有其中一個,或文件中其他位置的任何一個。