공백(예: "") 또는 개행(예: 캐리지 리턴)을 밑줄로 대체 - 특별한 경우

공백(예: "") 또는 개행(예: 캐리지 리턴)을 밑줄로 대체 - 특별한 경우

특수한 경우, 즉 두 개의 특정 문자열 사이에 공백(예: "")이나 개행(예: 캐리지 리턴)을 밑줄로 바꾸고 싶습니다.

HTML 페이지가 있는데 공백과 새 줄이 두 개의 특정 문자열 사이에 나타날 때 밑줄로 바꾸고 싶습니다.

예:

lots of text...
page_5.html months ago


This is the password: 6743412 <http://website.com etc...
more text...

나는 위에서 아래로 원한다:

lots of text...
page_5.html months ago__This_is_the_password:_6743412_<http://website.com etc...
more text...

기본적으로 나는 단지 문자열을 원 ago하고<http

중복된 HTML이므로 작동하게 하면 나중에 수정된 텍스트를 추출하는 것이 매우 도움이 되고 쉽게 될 것입니다.

sed나 awk를 사용하는 것이 나에게 가장 적합합니다.

답변1

"개월 전"과 "http://" 사이를 의미한다고 가정하면 이 perl스크립트는 원하는 작업을 수행합니다.

#! /usr/bin/perl

use strict;

my $join=0;

while(<>) {
    if (m/ ago$/) { $join=1 };
    if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; };
    if ($join == 1) {
        s/\s/_/g;
        s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/g;
    };
    print;
}

참고: 저는 의도적으로 위의 첫 번째 작업에서 줄 바꿈이 아닌 줄의 공백과 탭만 변경하도록 [[:blank::]]대신 사용했습니다. 두 번째 교체에서는 개행 문자를 포함한 모든 유형의 공백을 교체하고 싶습니다(바로 앞의 공백과 and 사이의 공백 제외).\ss///months agomonthsago

산출:

lots of text...
page_5.html months ago___This_is_the_password:_6743412_<http://website.com_etc...
more text...

다음을 사용하여 한 줄로 작성할 수도 있습니다 perl -p.

perl -p -e 'if (m/ ago/) { $join=1 }; if (m/http:\/\//) { $join=0 ; s/[[:blank:]]/_/g; }; if ($join == 1) {s/\s/_/g}; s/_(seconds|minutes|hours|days|weeks|months|years|ago_)/ $1/' speld.txt

답변2

Python 조각:

#!/usr/bin/env python3
import re
with open('file.txt') as f:
    f = f.read()
    spl = re.split(r'(\sago\n|<http://)', f)
    des = re.sub(r'\s', '_', spl[2])
    print(spl[0] + spl[1].replace('\n', '') + des + ''.join(spl[3:]), end='')

파일은 ago\n<http://구분 기호를 사용하여 섹션으로 구분됩니다 re.split. 그런 다음 인덱스 2의 값은 교체해야 하는 필수 부분입니다. 마지막으로 원하는 패턴으로 파일을 인쇄합니다.

답변3

진주:

perl -0777 -pe 's{(?<=\bago\b)(.+)(?=<http)}{ ($repl=$1) =~ s/\s/_/g; $repl }sge' file

노트:

  • -0777파일을 단일 문자열로 결합
  • "outer" s///명령은 수정될 모든 하위 문자열을 찾습니다.
  • "inner" s///명령은 모든 공백을 밑줄로 바꿉니다.

답변4

vim을 사용하면 터미널에서 다음 명령 하나로 이 작업을 수행할 수 있습니다.

vim -c '%s/ ago\n*/ ago__/g|wq' original.txt

Origin.txt가 수정되었으므로먼저 백업을 꼭 해주세요!

관련 정보