다른 줄에 나타나는 패턴 사이의 텍스트 제거 [중복]

다른 줄에 나타나는 패턴 사이의 텍스트 제거 [중복]

알아요유제누군가 이 포럼에 질문했지만, 내가 아는 한 그들 중 어느 누구도 다른 행에 있는 모드 문제를 다루지 않았습니다. 즉, 텍스트 파일이 주어지면

( one ) ( two ) (

three

)

four

쌍의 요소가 다른 줄에 있더라도 각 "(" 및 ")" 쌍 사이의 모든 항목을 어떻게 제거할 수 있습니까? 원하는 결과는 다음과 같습니다.

() () ()

four

답변1

perl:slurp를 사용하여 전체 입력을 단일 문자열로 처리하고 명령 s에 플래그를 사용하여 s///개행 문자가 일반 문자로 처리됨을 나타낼 수 있습니다.

perl -0777 -pe 's/\(.*?\)/()/sg' <<END
( one ) ( two ) (

three

)

four
END
() () ()

four

답변2

Python선택하다:

python -c 'import sys,re; print(re.sub(r"\([^()]+\)","()",sys.stdin.read().strip()))' <file

산출:

() () ()

four

답변3

이는 Python의 간단한 상태 머신으로 해결할 수 있습니다.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import fileinput
import sys

active = True
for line in fileinput.input():
    for ch in line:
        if ch == '(':
            sys.stdout.write(ch)
            active = False
        elif ch == ')':
            sys.stdout.write(ch)
            active = True
        elif active:
            sys.stdout.write(ch)

작업 솔루션

용법:

$ echo '( one ) ( two ) (

three

)

four' | python /tmp/statemachine.py

산출:

() () ()

four

답변4

sed중첩된 괄호가 있더라도 및 를 사용하여 처리합니다.

sed -z 's/[^()]*)/)/g' infile

입력하다:

( (zero) one ) ( two ) (

three

)

((((nested))here)end) last
four

산출:

( ()) () ()

(((()))) last
four

관련 정보