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/의 두 줄을 예약된 공간에 로드하여 "건너뛰고" "empty" 명령을 실행할 수 있습니다 b.

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

이렇게 하면 /exec/일치하는 항목이 없는 경우에만 명령이 실행됩니다./pre1/

물론 당신이 가지고 있다고 가정

 pre1
 pre2
 exec

그렇지 않으면

 exec

"pre1" 또는 "pre2" 이외의 다른 순서로는 절대 표시되지 않으며, 둘 중 하나만 표시되거나 파일의 다른 곳에 표시되지 않습니다.

관련 정보