문자열의 첫 번째 항목과 마지막 항목 (
사이의 공백을 제거하는 방법 )
. 다음과 같은 문자열이 있다고 가정해 보겠습니다.
(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
제게는 효과가 있는 것 같습니다.