중첩된 중괄호 사이의 공백 제거

중첩된 중괄호 사이의 공백 제거

문자열의 첫 번째 항목과 마지막 항목 (사이의 공백을 제거하는 방법 ). 다음과 같은 문자열이 있다고 가정해 보겠습니다.

(remove space ( fromthefile )between space).

나는 다음과 같이 출력을 얻어야한다

(removespace(fromthefile)betweenspace).

답변1

이렇게 하시면 됩니다,

 $ echo "(remove space ( fromthefile )between space)." | sed ':l s/\(([^ )]*\)[ ]/\1/;tl'
  (removespace(fromthefile)betweenspace).

이렇게 하면 괄호 사이의 공백만 제거됩니다.

다른 예시,

 $ echo "foo bar(remove space ( fromthefile )between space)." | sed ':l s/\(([^ )]*\)[ ]/\1/;tl'
 foo bar(removespace(fromthefile)betweenspace).

답변2

일반 정규 표현식으로 sed를 사용하여 이 작업을 수행하는 방법을 이해하지 못합니다.해서는 안 된다일치할 수 있는 중첩된 괄호. 다행스럽게도 Perl과 같은 것들은 다음과 같이 덜 정규식도 지원합니다.여기에 대답하세요:

echo "out side (in ( side ( ) ) remove ( spaces ) ) out ( in again )." |
 perl -lpe 's/\(([^()]|(?R))*\)/ local $_ = $&; s,\s+,,g; $_ /eg'
out side (in(side())remove(spaces)) out (inagain).

(비)정규 표현식은 다음과 같이 작동합니다.

\(([^()]+|(?R))*\)
^^|      |    ||^^  -- literal parenthesis, inside of which:
  ^      ^    ^|   --- group with choice:
   ^^^^^^ ^^^^ |  ---- anything except parenthesis, any number,
               |       OR this whole pattern again.
               ^ ----- any number of those two choices

교체 부분은 일치하는 문자열을 가져와서 $&로컬 변수에서 수정하고 모든 공백 문자를 제거한 다음 수정된 값을 반환합니다. ( 직접적으로 사용 하거나 s///의도하지 않았습니다 .)$&$1

(하지만 한 줄에 대괄호 세트가 하나만 있어서 처음부터 마지막까지 일치시킬 수 있다면 더 쉽습니다 ).

echo "out (in ( side) here ) out again." | 
 perl -pe 's/\(.*\)/ $_ = $&; s,\s+,,g; $_ /e'
out (in(side)here) out again.

$_면책조항: 내부적으로 사용하면 깨질지 모르겠지만 s///e제게는 효과가 있는 것 같습니다.

관련 정보