파일의 두 괄호 사이에 있는 문자열이나 숫자를 제거해야 하는 것과 같은 요구 사항이 있습니다. 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
(*)"더 간단하다"가능한아름다움은 보는 사람의 눈에 달려 있습니다…