2013-06-17 2 views
2

sed를 사용하여 문자열 내에서 공백과 특수 문자를 올바르게 이스케이프 처리하는 방법을 이해하기 위해 많은 게시물을 읽었지만 아직 만들 수 없습니다. 이루다.linux sed와 특수 문자로 문자열 바꾸기

나는이 하나처럼 일부 문자열을 포함하는 파일이 있습니다

JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=some_value" 

을하고 난 다음 사용하여 'some_value'을 대체하기 위해 노력하고있어 :

sed -i "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1$DORG_APACHE_CATALINA_JSESSIONID/" $JBOSS_CONFIGURATION/jboss.configuration 
  • $ JBOSS_CONFIGURATION 인 절대 리눅스 경로를 포함하는 변수.
  • jboss.configuration은 작업을 대체하기위한 대상으로 지정하는 파일입니다.
  • $ DORG_APACHE_CATALINA_JSESSIONID에 'some_value'의 대신 원하는 값이 포함되어 있습니다.

패턴 있습니다 :

JAVA_OPTS="$JAVA_OPTS -D 

은 항상 존재하고, org.apache.catalina.jsessionid 내가이 스크립트로 교체하기 위해 노력하고있어 변수 값의 예입니다.

누락되었거나 잘못 되었습니까? 나는 또한 성공하지 \ S를 사용하여 공백을 탈출, 전체를 울리는 것은 다음 나에게주는 시도 :

echo "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1$DORG_APACHE_CATALINA_JSESSIONID/" 

s/^\(JAVA_OPTS="$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*$/\1/ 

가하는 나오지으로 검색 패턴을 해석 에코입니까?

은 매우 환영하고 모든 정보/도움/다른 방법

는 여러분 모두 감사합니다

답변

2
echo 'JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=some_value"' | (export DORG_APACHE_CATALINA_JSESSIONID=FOO/BAR/FOOBAR; sed "s/^\(JAVA_OPTS=\"\$JAVA_OPTS[ \t]*-Dorg\.apache\.catalina\.jsessionid*=\s*\).*\$/\1${DORG_APACHE_CATALINA_JSESSIONID////\/}\"/") 

참고 bash는 확장 제대로을 종료하기 위해 $DORG_APACHE_CATALINA_JSESSIONID 후 여분 \" (순서는 sed를 여행 할 수있는 /을 탈출) 큰 따옴표. 다른 것보다 당신 나오지 표현은 나를 위해 작동하고 위의 명령은 때라도 결과를 출력하는 것이이 대답은 당신이 당신의 문제를 해결 도왔 경우 사용자가 비슷한 직면 있도록

JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.jsessionid=FOO/BAR/FOOBAR" 
+0

모든 응답은 유용했지만이 예제는 내가 제공 한 예제와 가장 일관성이 있습니다. 감사합니다. 그냥 빠른 추가, 패턴의 첫 번째 또는 두 번째 발생을 대체하는 스크립트를 수정하는 방법? – KRiSh05

+0

내가 무슨 뜻인지 잘 모르겠다. sed에서 마지막'/'다음에 'g'수정자를 사용하면 모든 발생을 대체합니다.'g'대신 숫자를 사용하면 해당 숫자에 해당하는 항목을 대체합니다. 예 : sed '/ foo/bar/g'은 'foo'의 모든 항목을 'bar'로 바꿉니다. sed '/ foo/bar/2'는 두 번째 항목 만 대체합니다. – rectummelancolique

+0

일반 정보가 정확합니다. 고맙습니다. 나는 이것에 대한 설명이 필요하다 : DORG_APACHE_CATALINA_JSESSIONID /////변수 값에서 탈출해야하는 문자만큼 /을 추가해야 하는가? 4 개의 연속 된 슬래시가 있다는 의미는 무엇인가? – KRiSh05

1

당신은 같이 나오지도 사용할 수 있습니다

sed -r '/\$JAVA_OPTS -D/{s/^(.+=).*$/\1'"$DORG_APACHE_CATALINA_JSESSIONID"'/;}' $JBOSS_CONFIGURATION/jboss.configuration 
+0

는, "허용"으로 표시 고려하시기 바랍니다 미래의 문제는 쉽게 볼 수 있습니다. – anubhava

1

당신은 일치하는 것이다 패턴을 지정할 수 있습니다 원하는 문자열을 정확하게 지정하려고하지 마십시오.

다음은 당신을 위해 작동합니다 :

sed -i 's#^\(JAVA_OPTS.*Dorg.apache.catalina.jsessionid\)=\([^"]*\)"#\1='"$DORG_APACHE_CATALINA_JSESSIONID"'"#' $JBOSS_CONFIGURATION/jboss.configuration 
1
sed 's/=\w.*$/='"$DORG_APACHE_CATALINA_JSESSIONID"'/' $JBOSS_CONFIGURATION/jboss.configuration 
관련 문제