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

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

하나의 여러 줄 문자열을 다른 여러 줄 문자열로 대체하여 업데이트하려는 파일이 많이 있습니다. 대략 다음과 같습니다.

* Some text, 
* something else
* another thing

나는 그것을 다음으로 바꾸고 싶습니다 :

* This is completely
* different text

결과적으로 교체 후 첫 번째 텍스트 블록을 포함하는 파일에는 이제 두 번째 문자열이 포함됩니다(파일의 나머지 부분은 변경되지 않은 상태로 유지됨).

문제의 일부는 업데이트할 파일 시스템에서 파일 목록을 찾아야 한다는 것입니다. 나는 이것을 달성하기 위해 grep을 사용할 수 있다고 생각합니다. (여러 줄 문자열로는 그렇게 쉽지는 않지만) sed를 통해 파이프할 수 있을까요?

찾을 수 있는 단축키가 있나요? Sed는 옵션인데 \n 등을 추가해야 해서 어색하네요. "이 파일에서 입력을 받아 이 파일과 일치시키고 다른 파일의 내용으로 바꾸십시오"라고 말할 수 있는 방법이 있습니까? 필요한 경우 Python을 사용할 수 있지만 빠르고 간단한 것을 원하므로 사용 가능한 유틸리티가 있으면 직접 스크립트를 작성하는 것(방법을 알고 있음)을 작성하는 것보다 Python을 사용하는 것이 좋습니다.

답변1

하나 이상의 입력 파일에서 "Some...\n...Thing"을 "new" 파일의 내용으로 바꿉니다.

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/...

답변2

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

무엇이 잘못되었는지에 대한 구체적인 설명을 확정할 때까지는 자신에게 맞는 솔루션을 찾는 데 어려움을 겪을 것 같습니다. 하지만 제 생각에는 QA가 가장 적합한 것 같습니다. 아마도 이것은 당신에게 아이디어를 줄 것입니다. 패턴 공간에서 항상 한 번에 3줄을 유지하고 2줄 미리보기를 사용하며 입력 파일에서는 한 번에 한 줄만 앞으로 미끄러집니다.

여러 줄(최대 3줄)에 걸쳐 있는지 여부에 관계없이 문자열과 일치할 수 있어야 합니다. 그러나 대체 조항을 반영하는 조항은 없습니다. 이는 항상 두 줄의 글로 구성됩니다.

답변3

하지만ripgrep 특히 인라인 대체는 지원되지 않습니다.--replace, 현재 기능이 이 사용 사례에 이미 유용하다고 생각합니다 .

rg --replace "$(cat new.txt)" --passthru --no-line-number \
--multiline --multiline-dotall 'Some.*?thing\n' multi.txt > output.txt
  • --replace 'string'대체 모드를 활성화하고 대체 문자열을 설정합니다. 등을 사용하여 $1캡처된 정규식 그룹을 포함 할 수도 있습니다.
  • $(cat new.txt)파일의 내용을 new.txt대체 문자열로 전달합니다.
  • --passthruripgrep일반적으로 정규식 패턴과 일치하는 행만 표시되기 때문에 필요합니다 . 이 옵션을 사용하면 파일에서 일치하지 않는 모든 줄도 표시됩니다.
  • --no-line-number / -N기본적으로 줄 번호가 출력에 포함되기 때문입니다 ripgrep(일치하는 줄만 표시할 때 유용함).
  • --multiline / -U여러 줄 처리를 활성화하며 기본적으로 비활성화되어 있습니다.
  • --multiline-dotall점('.') 정규식 패턴이 개행 문자( \n)와 일치하도록 하려는 경우에만 필요합니다.
  • > output.txt인라인 대체가 지원되지 않으므로 필수입니다. --passthrough및 옵션을 사용하면 no-line-number표준 출력이 필요한 새 파일을 대체 파일과 일치시키고 평소와 같이 저장할 수 있습니다.

그러나 이 명령은 각 파일에 대해 개별적으로 실행해야 하므로 여러 파일을 작업할 때는 유용하지 않습니다.

답변4

너무 강력하지는 않으며(두 번째 문자열을 확인하지 않지만 해결하기 쉽기 때문에) posix와 호환되지 않을 수 있지만 매우 간단합니다.

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

첫 번째 명령은 다음 줄을 추가합니다.일부 텍스트우리가 만날 때까지또 다른 한가지그런 다음 두 번째 줄에서는 이를 다른 텍스트로 변경합니다.

노트한도는일부 텍스트항상 따라야 한다또 다른 한가지.

관련 정보