구분 기호 사이에 여러 줄을 바꾸는 방법


2

텍스트 예를 들면 다음과 같습니다.

.... 텍스트 ..
{{{파이썬
string1 = 'abcde'
string2 = '12345'
인쇄 (문자열 1 [[1 ​​: 3]])
print (string2 [[:-1]])
}}}
.... 텍스트 ..

[[하고 ]]또한 외부 표시 {{{도. {{{and}}} 앞에 공백과 탭이있을 수 있습니다.

나는 모든 대체 할 [[]][]사이에 {{{}}}.

결과를 원래 파일에 다시 써야합니다.

어떻게해야합니까? 의지 sed또는 awk작동합니까?


이 구분 기호 외부에 텍스트가 있습니까? 다른 거있어?
slhck

예, 해당 구분 기호 외부에 텍스트가 있습니다.
stardiviner

나는 약간의 힌트를 발견했다 awk '/[{]{3}/,/[}]{3}/ { gsub(...)) }' file. 그러나 여전히이 문제를 해결할 수 없습니다.
stardiviner

답변:


3

이것은 당신을 위해 일할 수 있습니다 :

sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]/\1/g' file.txt

죄송합니다. {{{and}}} 앞에 공백이나 탭이 있다고 선언하지 않았으므로 ^는 \ * 등으로 변경해야합니다.
stardiviner

올바른 해결책을 찾았습니다.sed -i '/\s*{{{/,/\s*}}}$/s/\[\(\[[^]]*\]\)\]/\1/g' eg.txt
stardiviner

@ chris 다음에는 올바른 해결책을 포함하도록 답변을 편집하십시오. 비슷한 것을 찾는 사람들이 반드시 주석을 읽을 필요는 없습니다. 감사합니다!
slhck

2

이것은 작동해야합니다 :

awk '/{{{/,/}}}/ { gsub(/\[\[/,"[");gsub(/\]\]/,"]") } { print }'

원본 파일에 결과를 직접 쓰는 방법?
stardiviner

나는 그것이 awk내부 편집 을 지원 한다고 생각하지 않습니다 . 간단한 쉘 스크립트를 작성할 수 있습니다.
사이러스

2

작은 상태 변수와 함께 perl을 사용합니다. 아래를 replace.pl로 저장했다고 가정합니다.

#!/usr/bin/perl -w
my $inbraces=0;
while (<>) {
    /\{\{\{/ and $inbraces=1;
    $inbraces==1 && s/\[\[/[/;
    $inbraces==1 && s/]]/]/;
    /}}}/ and $inbraces=0;
    print $_;
}

다음과 같은 것을 실행하고 싶을 것입니다.

cat inputfile.txt | perl replace.pl > outputfile.pl

기본적으로 PERL은 while (<>)으로 인해 각 입력 행에 대해이 루프를 반복하며 3 행 정규 표현식과 일치하는 경우 각 행에 대해 대체를 수행해야하는지 여부를 설정합니다. 모든 정규 표현식은 sed와 거의 동일합니다. 키워드 특성으로 인해 일치하는 경우 열린 중괄호가 이스케이프됩니다.


'sed 또는 awk와 함께'
corn3lius

1
"아마도 sed 또는 awk만이 이것을 할 수있는 방법은 아닌가?" 선택적 독서 ... 나의 선하심.
mikebabcock 2016 년

나는 펄을 모른다. 이것은 작동 할 수 있지만 결과를 원본 파일에 쓸 수는 없다. 당신은 그것을 향상시킬 수 있습니까?
stardiviner

위의 내용은 수정 된 라인을 sed 또는 awk와 정확히 동일하게 출력하고 출력 리디렉션은 사용자에게 달려 있습니다. 샘플 명령 줄로 수정하겠습니다. "cat a | filter> b; mv b a"를하면 원하는 작업을 수행 할 수 있습니다.
mikebabcock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.