2009-07-02 4 views
32

어떻게 줄의 일부를 sed로 바꿀 수 있습니까?sed : 줄의 일부를 바꿉니다.

DBSERVERNAME  xxx 

라인은로 대체되어야한다

DBSERVERNAME  yyy 

값 xxx는 변할 수 있으며 DBSERVERNAME 상기 두 값 사이에 탭이 존재한다. 이 이름 - 값 쌍은 구성 파일의 많은 것 중 하나입니다.

echo "DBSERVERNAME xxx" | sed -rne 's/\(dbservername\)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' 

을하고 오류 결과 :

나는 다음 역 참조로 시도`s의 '명령의 우 1 \ 유효하지 않은 참조.

표현식에 문제가 있습니까? GNU sed 사용하기.

답변

39

을이 작동 :

sed -rne 's/(dbservername)\s+\w+/\1 yyy/gip' 

을 (당신이 -r 옵션을 사용하면, 당신은 괄호를 이스케이프 할 필요가 없습니다.)

+2

쉘 명령을 많이 사용하는 분들이 계시지 만 가능한 한 언제나 열심히 리눅스 놈들을 돌봐 주시길 바랍니다. '' ''설명이 필요합니다 .... 아니면 전체 [doc] (https://www.gnu.org/software/sed/manual/sed.html) – Mahesha999

2

(와)를 탈출하고 있습니다. 나는 네가 그렇게 할 필요가 없다고 확신한다. 시도해보십시오 :

 
sed -rne 's/(dbservername)[[:blank:]]+\([[:alpha:]]+\)/\1 yyy/gip' 
1

작은 따옴표를 사용할 때 이스케이프해서는 안됩니다. 즉.

echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername[[:blank:]]+)([[:alpha:]]+)/\1 yyy/gip' 
1

괄호를 벗어나지 마십시오. 시도 :

echo "DBSERVERNAME xxx" | sed -rne 's/(dbservername)[[:blank:]]+([[:alpha:]]+)/\1 yyy/gip' 
7

다른 사람은 이미의 탈출을 언급 한 괄호,하지만 라인의 첫 번째 부분이 일정한 경우 왜 뒤로 참조가 필요합니까?

당신은 단순히

sed -e 's/dbservername.*$/dbservername yyy/g' 
+1

좋은 지적! 나는 방금 regexps + sed를 사용하는 것에 대해 배웠고 마음은이 특별한 작업을보기 위해 'regexp'를 결정한 다음 'jwz'가 '나는 두 가지 문제가있다'고 말했고 (정규 표현식으로 인한 것이 아님)^ – calvinkrishy

+0

이것은 내 표를 얻는다. 이는 간단한 문제에 대한 가장 간단한 해결책이기 때문입니다. 역 참조를 사용하면'dbservername'의 두 복사본을 잘못 입력하는 것을 방지 할 수 있습니다. 여기서 분명하지만 sed에서 postgresql.conf를 수정할 때'listen_address' 또는'listen_addresses' (postgresql.conf)를 한눈에 볼 수 없습니다.두 가지 모두 그럴듯 해 보이지만, 하나만 맞습니다. –

1

을 할 수있는이 당신을 위해 작동 될 수 있습니다

echo "DBSERVERNAME  xxx" | sed 's/\S*$/yyy/' 
DBSERVERNAME  yyy 
0

sed -re 's/DBSERVERNAME[ \t]*([^\S]+)/\yyy/ig' temp.txt

또는이

시도3210 awk '{if($1=="DBSERVERNAME") $2 ="YYY"} {print $0;}' temp.txt