Unix에서 두 괄호 사이의 문자열을 제거하는 방법

Unix에서 두 괄호 사이의 문자열을 제거하는 방법

파일의 두 괄호 사이에 있는 문자열이나 숫자를 제거해야 하는 것과 같은 요구 사항이 있습니다. sed명령을 사용했지만 한 줄에서 실행됩니다. 여는 괄호는 한 줄에 있고 닫는 괄호는 다른 줄에 있습니다. 어떻게 해야 합니까?

다음 명령을 사용해 보았습니다 sed.

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

그러나 이것은 여는 괄호와 닫는 괄호가 같은 줄에 있는 경우에만 작동합니다.

예를 들어:-

입력 파일:

select a
,b
,c
FROM ABCD
(select e
,f
,g
,h FROM XYZ)

출력은 다음과 같아야 합니다.

select a
,b
,c
FROM ABCD

답변1

다음과 같은 간단한 Perl 스크립트를 사용하여 여러 줄에 걸쳐 있는 모든 대괄호 쌍과 해당 내용을 제거합니다.

#!/usr/bin/perl
undef $/;
$text = <>;
#Flags: g=match repeatedly; s=dot matches newline
$text =~ s/\(.*?\)//gs;
print $text;

이를 명령줄에 넣으려면 다음 한 줄 버전을 사용하세요.

perl -p0777e 's/\(.*?\)//gs' [filename]

Perl 솔루션보다 짧고 간단하다는 점에 유의하세요. -0777줄 구분 기호( -0아래의 플래그 참조 man perlrun)를 비활성화하여 전체 파일이 한 단계로 처리되도록 합니다. 좋은 오래된 Perl... 또한 (보통 Perl의 경우 :-)) sed의 패턴 공간을 조작하는 것보다 더 읽기 쉽습니다.

답변2

ew 줄을 유지합니다 \n(다음 두 줄에 괄호가 있는 경우).

sed -e 's/\(^[^)]*) *\)\|([^)]*\() *\|$\)//g' filename

스크립트에는 세 가지 모드가 포함되어 있습니다.

  • ^[^)]*) *이후 )까지를 제외하고 임의의 기호로 시작하는 행 ;)space(s)
  • ([^)]*(다음을 제외한 모든 기호 에서)
    • )또는 이후 space(s);
    • $(줄 끝) 까지

여러 줄의 경우:

sed ':1;s/([^)]*)//g;/(/{N;b1};' filename

답변3

Gnu Sed를 사용하세요.

-z옵션(널로 구분된 레코드), sed는 모든 입력을 단일 레코드로 처리합니다. 시도해 보십시오:

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

답변4

sed를 사용한 여러 줄 일치의 경우 일반적으로 전체 파일을 읽고 전체 내용에 대해 검색/바꾸기를 수행하는 것이 가장 쉽습니다.

sed -n '            # disable auto-printing
  1h                # first line, move to hold space
  1!H               # not the first line, append to hold space
  ${                # at the end of file
    x               # move hold space to pattern space
    s/([^)]*)//gp   # perform search/replace and print
  }
' file

더 간단한(*) 옵션도 있습니다:

awk -v RS="" '{gsub(/\([^)]+\)/,"")} 1' file
perl -0777 -pe 's/\(.*?\)//sg' file

(*)"더 간단하다"가능한아름다움은 보는 사람의 눈에 달려 있습니다…

관련 정보