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