2017-12-31 157 views
-1

내가 예를나오지 또는 AWK

내가 주석 라인에 A_place 값을 변경하려면
A_place = 10km 
B_place=5km 
#A_place=2km 
C_place=1km 

같은 일부 구성 파일을 사용하여 매개 변수 값을 교체합니다. 일부 줄에는 초기 공백이있을 수 있습니다. 기본 sed 명령을 찾아 교체했지만 작동하지 않았습니다. 아마도 스트림 편집기가 아닌 AWK을 사용해야할까요?

+4

왜 C 태그를 했습니까? 시도한'sed' 명령을 게시하십시오. 또한 얻은 결과와 원하는 결과를 게시하십시오. – kabanus

+2

질문에서 정밀도가 부족할 경우 올바른 대답은 "올바른 sed 명령 사용"입니다. –

+2

질문에 해당 샘플 입력에 대해 원하는 출력을 추가하십시오. – Cyrus

답변

1

나오지 : 여기 수행되고 있는지의

sed -e '/#/!s/\(A_place[[:space:]]*=[[:space:]]*\)\(.*\)/\1"new_value"/' input

고장 :

것은 리터를 건너 덧글 인 ines :

/#!

는 그런 형태로 대체를 제공

의// 새/

이전을 선택하고 그것이 나중에 유지 될 수 있도록 괄호 (역 참조) 내부의 원래 문자열을 넣어 오래된 \ 1을 지정합니다. 이것은 문자열 "A_place"에 이어 0 개 이상의 공백 문자 뒤에 이어 등호 다음에 공백 문자가 0 개 더 뒤에옵니다. 대체 할 값은 괄호 안에 있고 \ 2로 참조 할 수 있습니다. 여기에서는 필요하지 않으며 괄호는 생략 할 수 있습니다. 그래서 맞게 된 문자열입니다 :

( A_place [[: 공간 :]] * = [[: 공간 :]] * ) (. *) 출력

그런 다음 새로운 라인 "\ 1"백 심볼을 사용하여 등호 주변의 공백을 보존하고 "new value"를 추가합니다. 여기에는 새 줄의 리터럴이지만 최종 출력에 원하지 않는 명확성을 위해 따옴표가 표시되어 있습니다."\ 1"여기에 등호 주위에 공백을 포함하여 정규식 구분 된 첫 번째 괄호에서 일치 된 모든 서명입니다 :

\ 1 "NEW_VALUE"

0

awk 다음과 같이 도움이 될 수 있습니다.

awk '!/#/{sub(/A_place/,"new_value")} 1' Input_file 

OR의 경우 영업 이익

A_place 문자열의 마지막 열 값을 변경하고자는 사용 경우

awk '!/#/ && /A_place/{$NF="new_value"} 1' Input_file 

당신이 문자열 A_place의 1 개 이상 발생이 다음 subgsub을 변경 . 또한 같은 Input_file에 출력을 저장하려면 다음과 같은 코드를 사용할 수 있습니다. 사용

awk '!/#/{sub(/A_place/,"new_value")} 1' Input_file > temp_file && mv temp_file Input_file 

또는

awk '!/#/ && /A_place/{$NF="new_value"} 1' Input_file > temp_file && mv temp_file Input_file 
+2

이것은'A_place'를'new value'로 대체합니다. 그러나 OP는'A_place ='를 유지하고 거리를 수정하려고합니다. –

+0

@MOehm, 고맙습니다. 저도 그 해결책을 저의 포스트에 추가했습니다. – RavinderSingh13

+1

예,하지만 등호 주위에 공백이 없으면 새 변형이 작동하지 않습니다. ('A_place'는 그것들을 가지고 있지 않지만, 다른 행들은 이것이 유효한 문법이라는 것을 분명히합니다. 그러나'='필드 구분자를 만들 수 있습니다.) –

0

A_place의 새로운 거리를 설정합니다 다음 나오지도 표현 32km. 최대 새로운 거리에 이르기까지의 공간은 유지됩니다 : 정규 표현식에 대한 문제의

> cat kk.config 
A_place = 10km 
B_place=5km 
#A_place=2km 
C_place=1km 

> sed -i -e 's/^\(*A_place *= *\).*/\132km/' kk.config 

> cat kk.config 
A_place = 32km 
B_place=5km 
#A_place=2km 
C_place=1km 

하나는 너무 많은 맛이 있다는 것입니다. 분명히, sed는 기본 regexes를 사용하고 나중에 다시 참조 할 수 있도록 항목을 그룹화하려면 괄호를 백 슬래시로 묶어야합니다. 캐럿은 줄의 처음부터 일치를 시작할 것이므로 주석의 일치를 무시합니다. 우리는 몇 가지 가정 할 때

0

일반적인 솔루션은 awk으로 수행 할 수 있습니다

  1. 공백 = 주위에 항상 제거 할 수
  2. 우리는 왼쪽에 정확히 일치하는 검색합니다
  3. 키 값은 우리가 작은 쉘 래퍼 run.sh 재치를 만들 수 있습니다 이것으로 단일 인용 부호로 둘러싸이지 않은 단어

구성 시간 매개 변수로 키와 값은 :

key=$1 
value=$2 
awk -F '[ =]*' \ 
    -v key=$key \ 
    -v value=$value \ 
'/^#/ { print; next } 
$1 == key { $2 = value } 
    { print $1 "=" $2 }' sample.txt 

예는 실행

$ sh run.sh A_place 20km 
A_place=20km 
B_place=5km 
#A_place=2km 
C_place=1km 
0

간단한 sed 솔루션 :

val="2km" 
sed "/^[[:blank:]]*A_place[[:blank:]]*=/s/=.*/= ${val}/" file