sed를 사용하여 JAVA_HOME을 업데이트하거나 추가하세요.

sed를 사용하여 JAVA_HOME을 업데이트하거나 추가하세요.

새로운 vm 스택 스크립트를 작성하고 JAVA_HOME파일을 업데이트하거나 추가하려고 합니다.~/.bashrc

sed명령줄에서 다음 명령을 실행하여 이 작업을 성공적으로 수행했습니다.

sed '/export[ ]JAVA_HOME=/{h;s/=.*/='"updatedJava"'/};${x;/^$/{s//export JAVA_HOME='"newJava"'/;H};x}' -i ~/.bashrc

그러나 변수를 사용하여 스크립트에서 실행하려고 하면 다음 오류가 발생합니다.

sed: -e 표현식 #1, 문자 34: 's'에 대한 알 수 없는 옵션

/내 경로에 delimiters 가 혼동되었기 때문에 이것이 발생했다는 것을 알았으므로 sed다음과 같이 변경했습니다.

 sed '/export[ ]JAVA_HOME=/{h;s#=.*#='$java'#};${x;/^$/{s##export JAVA_HOME='$java'#;H};x}' -i ~/.bashrc

여기에는 $javaJava에 대한 경로가 포함되어 있지만 이제는 작동하지 않거나 예외가 발생하지 않습니다. 내가 뭘 잘못했나요?

답변1

여러분의 논리를 유지하면서 sedJAVA_HOME에 대한 변경 사항이 sed 시작 시 한 번만 수행되는 좀 더 간결한 형식으로 다시 작성했습니다.

rhs또한 명령 에 포함하기에 적합하도록 Java 변수를 이스케이프하는 방법도 있습니다 s/// sed.

게다가 -ly sed입니다 POSIX.

java_esc=$(printf '%s\n' "$java" | sed -e 's|[\&/]|\\&|g;$!s/$/\\/')

sed -i.BAK -e '
   1{
      x
      s/.*/export JAVA_HOME='"$java_esc"'/
      x
   }

   # assuming the JAVA_HOME declaration does not span line boundaries
   /^[[:blank:]]*export[[:blank:]]\{1,\}JAVA_HOME=/{
      g
      x
      s/^/\
/
      x
   }

   ${
      x
      /^\n/!H
      x
   }
' ~/.bashrc

답변2

"두 번째 명령은 대체 문자열에서 문자를 제거했습니다 . s마지막에 당신이 무엇을 하고 있는지 이해가 안 돼요 . 그러면 어떻습니까?

sed '/export \{1,\}JAVA_HOME=/{h;s#=.*#="'$java'"#};${x;/^$/{s##export JAVA_HOME="'$java'"#;H};x}' -i ~/.bashrc

관련 정보