file (inplace replace)에서 여러 줄을 한 단어로 바꾸려면 어떻게합니까?


9

filename파일의 내용은 다음과 같습니다 (예 :).

My block of line starts from here 
START
First line
second line
third line
END
and end to here for example.

예를 들어와 같이 한 단어 사이 STARTEND한 단어 로 줄 블록을 바꾸고 싶습니다 SINGLEWORD. 아래처럼 :

My block of line starts from here 
SINGLEWORD
and end to here for example.

이 명령을 사용하여 라인 블록을 찾을 수 있습니다.

grep -Pzo "START(.|\n)*END" filename

위 명령을 실행 한 결과는 다음과 같습니다.

START
First line
second line
third line
END

그런 다음이 명령을 사용하여 모든 줄을 한 줄로 결합했습니다.

LAST_RESULT | sed -e :a -e '/$/N; s/\n/ /; ta'

그런 다음이 결과를 얻습니다.

START First line second line third line END

그리고 마지막 명령으로 LAST_RESULTS | sed 's/.*/SINGLEWORD/'그것들을 변경 "SINGLEWORD"하고이 결과를 얻습니다.

SINGLEWORD

이제 내가 원하는 것은 : 어떻게이 명령 (또는 제안 명령)을 사용하고 내 줄 블록을 "SINGLEWORD"단어로 대체 할 수 있습니까? 그리고 최종 결과는 다음 파일과 같습니다.

My block of line starts from here 
SINGLEWORD
and end to here for example.

답변:


14

이 작업은 perl다음 과 같이 매우 쉽게 수행 할 수 있습니다 .

$ perl -i -p0e 's/START.*?END/SINGLEWORD/s' file
$ cat file
My block of line starts from here 
SINGLEWORD
and end to here for example. 

설명

-0 줄 구분자를 null로 설정

-p-e각 줄에 주어진 스크립트를 적용하고 그 줄을 인쇄하십시오

정규식 수정 자 :

  • /s문자열을 한 줄로 취급하십시오. 즉, .어떤 문자 든, 개행 문자와 일치하도록 변경 하면 일반적으로 일치하지 않습니다.

?:

  • 기본적으로, 정량화 된 하위 패턴은 "욕심"입니다. 즉, 패턴의 나머지 부분은 계속 일치시키면서 가능한 한 여러 번 (특정 시작 위치가 제공됨) 일치합니다. 가능한 최소 횟수와 일치 시키려면 수량 자로 a를 사용하십시오 ?.

@KasiyA : 사용 sed은 가능해야하지만 읽기 어려울 것입니다 (이 질문을보십시오 )
Sylvain Pineau

하나 더 내 START와 END 패턴은 특수 문자 (있기 때문에 /, *, ?그것에을) 이들은 단지 예이다. 명령을 설명해 주시겠습니까?
αғsнιη

@KasiyA 당신은 \와 같은 문자를 탈출 할 수 (정확하게와 같은 sed) : \/, \*,\?
실뱅 피노

@KasiyA 나는 시도했다 perl -i -p0e 's/\/\*.*?\*\//SINGLEWORD/sm'. 작동해야합니다
Sylvain Pineau

@KasiyA 나는 지금 설명으로 끝났다고 생각한다;)
Sylvain Pineau

14

이없이 가능한 경우 궁금 해서요 perl, python등. 그리고 다음을 사용 하여이 솔루션을 찾았습니다 sed.

$ sed ':a;N;$!ba;s/START.*END/SINGLEWORD/g' filename

설명:

  1. : a 라벨 'a'를 만듭니다.
  2. N 다음 줄을 패턴 공간에 추가
  3. $! 하지의 마지막 줄 경우 , 분기 라벨 'A'(에 이동)
  4. s의 대체는 , /START.*END/에 의해 SINGLEWORD, / g (가 할 수있는만큼 여러 번) 글로벌 경기

여기에서 발견 되었습니다 .

@KasiyA, 많은 흥미로운 것들을 배웠습니다 감사합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.