2011-11-17 3 views

답변

5
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt 

할 것입니다.

이 문제는 sed의 버퍼에 전체 입력 문자열을 저장한다는 점에서 문제가 있습니다.

자세한 내용 및보다 효율적인 버전은 sed and Multi-Line Search and Replace을 참조하십시오.

sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt 

또는 원본 파일을 편집하려면 :

0

이 당신을 위해 작동 할 수

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file 

편집 :

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' 
> aaa 
> EXTRATHING { 
> }; 
> bbb 
> EXTRATHING { 
> }; 
> ccc 
> ! 
aaa 
SOMETHING{} 
bbb 
SOMETHING{} 
ccc 

편집 : 여기의 요청을 예입니다 : 첫 번째 및 마지막 주소가 연속 라인 인 경우 다음을 사용하십시오.

,210
# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}' 
> aaa 
> EXTRATHING { 
> bbb 
> }; 
> ccc 
> EXTRATHING { 
> }; 
> ddd 
> ! 
aaa 
EXTRATHING { 
bbb 
}; 
ccc 
SOMETHING{} 
ddd 

또 다른 방법은 (아마도 쉽게?) :

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D' 
SOMETHING {}; 
+0

예를 들어이 게시글을 게시하려면 ;-)? 나는 원래의 문서를 반환했다. 행운을 빌어 요. – shellter

+0

감사합니다. @potong. 그러나 "EXTRATHING {"과 "};"사이에 다른 줄이 있으면 명령은 원래 패턴을 제거합니다. 나는 그 사람들이 대체되기를 원하지 않는다.그래서, 다음은 "EXTRATHING {\ n something \ n};"로 대체되어서는 안됩니다. " – bbv

+0

고마워, 당신의 코드가 sed 4 *에서 작동하지만 UWIN에서 가지고있는 버전없는 버전에서는 작동하지 않는다. 범위 표현을 사용하여 두 줄을 캡처하고 있습니까? 즉'/ x /,/y /'? 모두에게 행운을 빕니다. – shellter

3

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

+4

설명해 주시겠습니까? 감사. :) – Ray

+1

나는 질문의 나쁜 이해를 기반으로 생각합니다. – BCS

3
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt 
1
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file 

아래 테스트 :

> cat temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
EXTRATHING { 
}; 
ghekg 
jhgjk 
wefjkwngk 
EXTRATHING { 
    }; 
jbgvjnrg 
jbfw 
wefnkwk 
EXTRATHING { 
}; 
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
SOMETHING{}; 
ghekg 
jhgjk 
wefjkwngk 
SOMETHING{}; 
jbgvjnrg 
jbfw 
wefnkwk 
SOMETHING{}; 
> 

이 파일 인라인을 변경하려면 . -i 플래그를 추가하십시오. 처럼 :

perl -i -lne '.......' your_file 
0

그것은 나오지에 할 어려운, 첨자를 작성해야합니다. -e는 하나를 말한다

perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt 

-0777가 (텍스트 파일 endline가) 기록 구분을하다 화면에 표시되는 모든 파일 및 인쇄에 대한 명령을 실행 -p : 그러나, 당신은 펄을 사용하여 한 줄을 사용할 수 있습니다 라인 명령