새로운 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
여기에는 $java
Java에 대한 경로가 포함되어 있지만 이제는 작동하지 않거나 예외가 발생하지 않습니다. 내가 뭘 잘못했나요?
답변1
여러분의 논리를 유지하면서 sed
JAVA_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