파일에서 여러 줄 문자열 바꾸기


17

하나의 여러 줄 문자열을 다른 여러 줄 문자열로 바꾸어 업데이트하려는 파일이 많이 있습니다. 다음과 같은 내용이 있습니다.

* Some text, 
* something else
* another thing

그리고 나는 그것을 다음과 같이 바꾸고 싶다 :

* This is completely
* different text

그 결과 대체 후 첫 번째 텍스트 블록을 포함하는 파일은 이제 두 번째 문자열을 포함하게됩니다 (파일의 나머지 부분은 변경되지 않음).

문제의 일부는 파일 시스템에서 업데이트 할 파일 목록을 찾아야한다는 것입니다. 나는 grep을 사용할 수 있다고 생각합니다 (다행 문자열로하기 쉽지는 않지만) sed로 파이프 할 수 있습니까?

이 작업을 수행하는 쉬운 방법이 있습니까? Sed는 옵션이지만 \ n 등을 추가해야하기 때문에 어색합니다. "이 파일에서 입력을 가져 와서 해당 파일에서 일치시킨 다음 다른 파일의 내용으로 바꾸십시오"라고 말하는 방법이 있습니까? 필요한 경우 파이썬을 사용할 수는 있지만 빠르고 간단한 것을 원하므로 사용 가능한 유틸리티가 있으면 내 스크립트를 작성하는 것보다 사용하는 것이 좋습니다 (내가하는 방법을 알고 있음).


아마도 이것을 위해 perl을 사용해야 할 것입니다. stackoverflow.com/questions/1030787/…
orion

3
그래서 some text, something else another thing여러 줄에 걸쳐 있는지 여부 를 일치시키고 싶 습니까? 아니면 당신은 일치하고 싶어 some text,\nsomething else\nanotherthing?
mikeserv

2
질문을 편집하고 각 파일의 내용이 정확히 무엇인지, 원하는 출력이 무엇인지 명확히하십시오.
jimmij

문자열은 여러 줄에 걸쳐 있습니다. 일치 / 교체 할 때 공백을 무시하십시오. 모두 동일하지 않을 수도 있기 때문에 1-1 일치 (개행 및 모두)를 수행하면 큰 문제가 아닙니다.
ventsyv

답변:


12

하나 이상의 입력 파일에서 "new"파일의 내용으로 "Some ... \ n ... Thing"을 대체하십시오.

perl -i -p0e 's/Some.*?thing\n/`cat new`/se' input.txt ...
  1. -i input.txt를 직접 변경하려면
  2. -p0 입력 파일을 확인하고 마지막에 인쇄
  3. s/regexp/.../s 정규 표현식 .에서.|\n
  4. s/.../exp/e ~로 대체하다 eval(exp)
  5. new-대체 텍스트를 포함하는 파일 (완전히 ... 다른 텍스트 임)
  6. 유용한 경우 원본 텍스트를 확장 할 수 있습니다 s/Some text\n...\n...thing\n/...

해당 파일의 (여러 줄) 내용을 찾기 위해 "before"라는 파일로 어떻게 똑같이 할 수 있습니까? 시도했지만 작동하지 않습니다.
Kvothe

@Kvothe, 자세한 내용이 필요합니다 ... "이전"에 특별한 문자가 없다고 가정하면 다음을 시도해 볼 수 있습니다.perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
JJoao

"before"에 '및`를 제외한 모든 특수 문자 (줄 바꾸기, 슬래시, 대괄호)가 포함되어 있다고 가정합니다.
Kvothe

5
sed -e :n -e '$!N;/\n.*\n/!{$!bn
};  s/some text,\n* *something else\n* *another thing/this is completely\
different text/;P;D' <infile

문제에 대한 구체적인 설명을 도출 할 때까지 귀하에게 적합한 솔루션을 제공하는 데 어려움을 겪을 것으로 예상됩니다. 어쩌면 이것은 당신에게 아이디어를 줄 것입니다-그것은 한 번에 한 줄씩 입력 파일을 통해 앞으로 밀면서 항상 한 줄에 3 줄을 패턴 공간에 유지합니다.

문자열이 여러 줄에 걸쳐 있는지 여부에 관계없이 문자열을 일치시킬 수 있어야합니다. 그러나 대체품에 해당 조항을 미러링하기위한 규정은 없습니다. 규정 된대로 항상 두 줄에 걸쳐 있습니다.


0

강력하지는 않지만 (두 번째 줄을 잡지 않지만 정착하기 쉽기 때문에) posix 컴파일되지는 않지만 매우 간단합니다.

sed '/^Some text/{:1;/another thing$/!{N;b 1}
     s/.*/this is completely\ndifferent text/g}' input.txt

첫 번째 명령 은 다른 것을 만날 때까지 일부 텍스트 에서 줄을 추가 한 다음 다른 줄로 변경합니다.

참고 제한이 있다는 것입니다 일부 텍스트가 항상 다음에해야 또 다른 한가지 .


문제는 문자열이 2 줄 이상 (최대 12 개 정도)이고 탭 등 * 이스케이프해야 할 다른 항목을 포함 할 수 있다는 것입니다.
ventsyv

@ventsyv 줄이나 구분 기호에는 문제가 없습니다. 스크립트는 시작과 끝만 확인합니다. 확실히 한 정도로되어 시작 문자열 변화에 텍스트를 표시 할 수 있습니다 exeptionally 경우 . 더 나은 것이 없다면 올바른 예제를 생성하기 위해 입력 예제를 보여주십시오.
Costas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.