너무 많고 너무 적은 공백 문자를 수정하는 방법은 무엇입니까?

너무 많고 너무 적은 공백 문자를 수정하는 방법은 무엇입니까?

다른 사람들이 편집한 파일이 있습니다. 여기에는 다음과 같은 줄이 포함되어 있습니다.

<E> This is text </E>

나는 일부 Bash 쉘 스크립트를 사용하여 이러한 텍스트 줄에 대해 일련의 텍스트 대체 기능을 수행합니다. 그러나 텍스트 바꾸기가 작동하려면 형식이 완전히 정확해야 합니다. 그것은 대부분 사실이지만, 내가 이 파일을 받는 편집자가 철자 오류를 범하지 않을 것이라고는 확실히 기대할 수 없습니다.

형식의 일부는 앞뒤에 <E>공백이 있습니다 </E>. 그 이상도 이하도 아닌. 따라서 다음은 올바르지 않습니다.

<E>This is text </E>
<E> This is text</E>
<E> This is text     </E>
<E>   This is text </E>

나는 내가 sed사용할 수 있다는 것을 안다특정한문제는 이전의 두 공백과 같습니다 ( 내가 다루고 있는 텍스트에도 문자가 포함되어 있기 때문에 대신 </E>사용됨 ).#//

sed -i '$ s#  </E>#" </E>#g' *.txt

...하지만 알 수 없는 번호를 검색하는 데 어떻게 사용하는지 모르겠습니다. 또한 공백이 없으면 인접한 문자 <E>또는 </E>임의의 문자가 있을 수 있습니다.

가장 중요한 것은 공백이 없고 텍스트와 레이블을 구분하는 두 개 이상의 공백이 있는 인스턴스를 검색하여 하나의 공백으로 변환하려면 <E>어떻게 해야 합니까?</E>

답변1

sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g'

(참고: 저는 정규식 구분 기호 !대신 #또는를 사용합니다. 개인 취향입니다.)/

sed-e각 명령 앞에 이 플래그가 붙는 한 여러 명령을 전달하여 입력에 대해 실행할 수 있습니다 .

위 정규식 에서 후행 공백은 *"0개 이상의 공백 문자와 일치"를 의미합니다. 매뉴얼 re_format페이지에서는 이러한 유형의 복제에 대한 자세한 정보를 제공합니다.

뒤에 ' '가 오는 원자는 *해당 원자와 일치하는 항목이 0개 이상 포함된 시퀀스와 일치합니다. 뒤에 ' '가 오는 원자는 +해당 원자가 1회 이상 나타나는 순서와 일치합니다. 뒤에 ' '가 오는 원자는 ?해당 원자에 대해 0 또는 1개의 일치 항목과 일치합니다.

*여기서 "atom"은 +또는 이전 하위 패턴 입니다 ?.


귀하의 예에서 다음 명령을 실행하십시오 sed.

reedm@www:/tmp $ cat > example.txt
<E>This is text </E>
<E> This is text</E>
<E> This is text     </E>
<E>   This is text </E>
reedm@www:/tmp $ sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g' example.txt 
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>

답변2

"적어도 하나의 공백"은/ \+/

"0개 이상의 공백"은/ */

"공간이 아니다"는/[^ ]/

"two or more spaces" is either /   */ or /  \+/

답변3

echo $STRING | tr -s " "

여러 개의 연속 공백 문자를 제거하고 단일 공백으로 줄여야 합니다. 그 다음 공백 하나를 어떻게 처리할지 결정하는 것은 사용자의 몫입니다.

답변4

처리된 정규 표현식을 봅니다 sed(1). 아래에많은\+이전 작업을 1회 이상 반복 하도록 선택할 수 있습니다 . 따라서 sed -i -e 's; \+</E>;</E>;g' *.txt삭제됩니다어느앞의 공백 수입니다 </E>. GNU sed 정보 매뉴얼( pinfo(1)내가 찾은 최고의 리더지만 YMMV)을 보면 매뉴얼 페이지가 확실히 없습니다. 세부 노드 목록에서 "정규식"을 선택합니다.

관련 정보