다른 사람들이 편집한 파일이 있습니다. 여기에는 다음과 같은 줄이 포함되어 있습니다.
<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)을 보면 매뉴얼 페이지가 확실히 없습니다. 세부 노드 목록에서 "정규식"을 선택합니다.