2016-08-19 4 views
-1

내가sed 명령 줄에서 변수를 사용하는 방법은 무엇입니까?

# some other configuration settings 
..... 
wrapper.java.classpath.1=/opt/project/services/wrapper.jar 
wrapper.java.classpath.2=/opt/project/RealTimeServer/RTEServer.jar 
wrapper.java.classpath.3=/opt/project/mysql-connector-java-5.1.39-bin.jar 
..... 
# some other configuration settings 

을 가지고이 구성 파일을 가지고 내가이

# some other configuration settings 
..... 
wrapper.java.classpath.1=/opt/project/services/wrapper.jar 
wrapper.java.classpath.2=/opt/project/RealTimeServer/RTEServer.jar 
wrapper.java.classpath.3=/opt/project/mysql-connector-java-5.1.39-bin.jar 
wrapper.java.classpath.4=/opt/project/RealTimeServer/some_other.jar 
..... 
# some other configuration settings 

같이 할 그래서 나는이 방법

를 호출

#!/bin/bash 

CONF_FILE=$1 
JAR_FILE=$2 
DIR=$3 

# Get the last wrapper.java.classpath.N=/some_path line 
CLASSPATH=`awk '/classpath/ {aline=$0} END{print aline}' $CONF_FILE` 
echo $CLASSPATH 

# Get the left side of the equation 
IFS='=' read -ra LS <<< "$CLASSPATH" 

# Get the value of N 
NUM=${LS##*\.} 

# Increment by 1 
NUM=$((NUM+1)) 
echo $NUM 

NEW_LINE="wrapper.java.classpath.$NUM=$DIR/$JAR_FILE" 
echo $NEW_LINE 

# Append classpath line to conf file 
sed "/$CLASSPATH/a \\${NEW_LINE}" $CONF_FILE 

이 bash 쉘을 썼다

./append_classpath.sh some_file.conf some_other.jar /opt/project/RealTimeServer 

하지만 얻을 수

sed: -e expression #1, char 28: unknown command: `o' 
+3

무엇 거대한되지 않으면 괜찮을 여기에 변수가 있습니까? – heemayl

+1

우리에게 모든 정보를주십시오. 테스트 파일, 변수 및 사용중인 OS와 쉘 –

+0

어둠 속에서 그냥 쐈다 : '$ {some_string}'사용해보기. $는 변수 이름의 첫 글자 만 보입니다. $ {some_line}과 동일합니다. – steffen

답변

0

방금 ​​쉘 스크립트를 보았습니다. 셸은 도구를 호출 할 수있는 환경이며 텍스트를 조작하는 도구는 아닙니다. 텍스트를 조작하는 표준 범용 유닉스 도구는 awk입니다. 전체 쉘 스크립트가 감소 될 수있다 : 상기는 일치하는 3 인수에 대한 GNU의 AWK를 사용

$ dir="/opt/project/RealTimeServer" 
$ jar_file="some_other.jar" 
$ awk -v new="$dir/$jar_file" 'p~/classpath/ && !/classpath/{match(p,/([^=]+\.)([0-9]+)=/,a); print a[1] (++a[2]) "=" new} {print; p=$0}' file 
# some other configuration settings 
..... 
wrapper.java.classpath.1=/opt/project/services/wrapper.jar 
wrapper.java.classpath.2=/opt/project/RealTimeServer/RTEServer.jar 
wrapper.java.classpath.3=/opt/project/mysql-connector-java-5.1.39-bin.jar 
wrapper.java.classpath.4=/opt/project/RealTimeServer/some_other.jar 
..... 
# some other configuration settings 

(). UNIX 환경에서 텍스트를 조작해야한다면 Arnold Robbins의 Effective Awk Programming, 4th Edition을 읽어보십시오.

이 구문은 당신이 뭘 하려는지입니다 :

sed '/'"$some_string"'/a '"$some_line" "$some_file" 

을하지만 그것을하지 마십시오 또는 당신이 자신을 비난 할거야 이제 다시 질문에


비밀스럽고, 휴대 가능하지 않고, 유지가 어렵고, 양파를 벗겨 내고, 도망 치는 모든 지옥 (Is it possible to escape regex metacharacters reliably with sed 참조)!

sed는 개별 행에 대한 간단한 하위 항목입니다. 다른 어떤 것, 예 : 당신이 시도하고있는 것을, 당신은 AWK를 사용한다 :

awk -v regexp="$some_string" -v line="$some_line" '{print} $0~regexp{print line}' file 

쉘 변수의 이름은 있지만, 당신은 정규 표현식 문맥에서 사용 된 "some_string"고 주 그래서 나는 그것을 사용 (당신은 나오지도 함께 할 수있는 모든) awk 명령의 regexp 컨텍스트를 지정하고 명확성을 위해 "string"대신 awk 변수 "regexp"를 이름을 지정합니다 (단순한 변수 이름이지만 숨겨진 의미는 없습니다). 당신이 정말로 그것을 오히려 정규 표현식보다 문자열로 취급하려는 않은 경우

그는 것 :

awk -v string="$some_string" -v line="$some_line" '{print} index($0,string){print line}' file 

위의 유일한주의해야 할 점은 쉘 변수에 백 슬래시가 확장 될 것입니다 때 AWK 변수가 초기화되므로 예를 들어 \t이 리터럴 탭 문자가됩니다. 이것이 바람직하지 않다면 우리는 백 슬래시를 확장하지 않는 awk 변수를 초기화하기위한 대체 구문을 제공 할 수 있습니다 (http://cfajohnson.com/shell/cus-faq-2.html#Q24 참조).

+0

'sed'/ '를 시도해보십시오. 고마워요,하지만 이걸 시도해 봤는데 라인을 추가하지 않았습니다. 래퍼 행의 전후에는 행이 있습니다. 이를 반영하기 위해 내 게시물을 수정하겠습니다. –

+0

일치하는 작은 따옴표를 여기에 놓치셨습니까? sed '/' "$ some_string" '/ a ""$ some_line "'"$ some_file ". 문법을 수정 한 후에도 사용하지 못했습니다. –

+0

맞습니다. 실제 입력이 샘플 입력과 다르게 표시되면 모든 베팅이 해제됩니다. 어쨌든 sed 명령에 대한 인용문을 놓친 것일 수도 있으므로 중요하지 않습니다. 실제로 그것은 하나의 인용구가 너무 많습니다. –

0

sed 명령은 변수의 슬래시에 문제가 있습니다.

CLASSPATH="wrapper.java.classpath.4=/opt/project/RealTimeServer/some_other.jar" 
NEW_LINE="wrapper.java.classpath.5=your/data.rar" 

echo "# some other configuration settings 
..... 
wrapper.java.classpath.1=/opt/project/services/wrapper.jar 
wrapper.java.classpath.2=/opt/project/RealTimeServer/RTEServer.jar 
wrapper.java.classpath.3=/opt/project/mysql-connector-java-5.1.39-bin.jar 
wrapper.java.classpath.4=/opt/project/RealTimeServer/some_other.jar 
..... 
# some other configuration settings 

Some more config lines 
" | sed "s#${CLASSPATH}#&\n${NEW_LINE}#" 
+0

슬래시보다 더 많은 문자에 문제가 발생합니다. 예를 들어 BRE regexp 메타 문자, 백 슬래시 다음에 숫자 또는 '&'. sed를 사용하여이 작업을 수행하는 데 필요한 작업은 http://stackoverflow.com/q/29613304/1745001을 참조하십시오. –

0

이 같은 같은 # 시도 뭔가 독특한 구분에 대한 봐는 하나의 패스 순수 bash는 솔루션입니다 - 구성 파일이

pfx=wrapper.java.classpath. 
while IFS= read -r line; do 
    if [[ $line == $pfx*=* ]]; then 
    lastclasspath=$line 
    elif [[ -n $lastclasspath ]]; then 
    newline=${lastclasspath#$pfx} 
    num=${newline%%=*} 
    newline="$pfx$((num+1))=$DIR/$JAR_FILE" 
    echo "$newline" 
    unset lastclasspath 
    fi 
    echo "$line" 
done <$CONF_FILE 
관련 문제