하나 이상의 문자 앞에 있는 일부 문자(전부는 아님)를 제거하는 방법은 무엇입니까?

하나 이상의 문자 앞에 있는 일부 문자(전부는 아님)를 제거하는 방법은 무엇입니까?

문자 앞의 모든 항목을 삭제하려면(예: "(") 이렇게 합니다 's/.*(//g'. 이제 특정 문자 앞의 문자/항목 하나만 삭제하고 싶습니다(제 경우에는 공백 -포함 ) .(

몇 가지를 시도했지만 성공하지 못했습니다. 예는 다음과 같습니다:

sed 's/ *(/(/g'

그러나 이것은 이전 공백만 제거하고 다른 공백은 제거하지 않습니다. 이는 코드를 읽을 때 의미가 있습니다(공백과 사이에 있는 모든 항목이 제거되지만 (여기에서 요청하기 전에 뭔가를 시도해야 함). 그래서 다음을 시도했습니다. 둘 다 작동하지 않습니다)

sed 's/* (/(/g'

하지만 이번에는 왜 안되는지 모르겠습니다. 공백은 매우 특수한 문자이기 때문인 줄 알고 대신 -( s/*- (/(/g's/*-* (/(/g')를 사용해 보았지만 역시 작동하지 않았습니다.

입력하다:

081 379 62 49 (Hems)
081-379-62-49 (Hems) 

원하는 출력:

0813796249 (Hems)

답변1

앞에 있는 공백과 대시를 모두 제거하시겠습니까 (? 그런 다음 공백과 대시를 포함하는 문자 클래스나 "대괄호 표현식"을 사용해야 합니다.[- ]

sed -e 's/[- ]*(/(/g'

자세한 내용을 확인 man 7 regex하고 검색하세요 bracket expression.

언급한 입력( 081 379 62 49 (Hems)또는 081-379-62-49 (Hems))을 사용하여 다음을 수행할 수 있습니다 awk.

awk -F'(' 'BEGIN {OFS=" ("} ; {gsub(/[- ]/,"",$1) ; print}'

이는 awk에게 필드 구분 기호를 사용한 (다음 해당 gsub()기능을 사용하여 첫 번째 필드(전화번호)에서 공백과 대시를 제거하도록 지시합니다. OFS(출력 필드 구분 기호)는 올바른 출력을 생성하기 위해 ((공백 및 )로 설정됩니다.(

예를 들어

echo -e "081 379 62 49 (Hems)\n081-379-62-49 (Hems)" | 
    awk -F'(' 'BEGIN {OFS=" ("} ; {gsub(/[- ]/,"",$1) ; print}'
0813796249 (Hems)
0813796249 (Hems)

그런데 (...)전화번호 뒤에 공백이나 대시가 없으면(내부와 같이) sed를 사용하여 이 작업을 수행할 수도 있습니다.

echo -e "081 379 62 49 (Hems)\n081-379-62-49 (Hems)" | 
    sed -e 's/[ -]//g ; s/(/ (/'

이렇게 하면 입력 줄에서 모든 공백과 대시가 제거되고 (. 괄호 안에 여러 단어(설명/이름 필드?)가 있으면 출력이 정말 보기 흉해집니다.

공간을 보존하기 위해 전화번호를 복사하고 거기에서 수정한 다음 출력 라인에 다시 삽입하는 등 sed에서 이를 올바르게 수행하는 끔찍할 정도로 복잡한 방법이 있을 수 있지만 awk를 사용하여 수행하는 것이 더 쉽습니다.

답변2

이는 다음에 적용됩니다 sed.

printf %s\\n '081 379 62 49 (Hems)' \
             '081-379-62-49 (Hems)' |
sed 's/\( ([^)]*)\)\{0,1\}[ -]\{0,1\}/\1/g'

0813796249 (Hems)
0813796249 (Hems)

비결은 sed삭제하려는 문자열 중 하나도 삭제되지 않을 때 빈 문자열을 삭제하도록 하는 것입니다. 이러한 방식으로 g로컬 교체는 전체 패턴 공간에 걸쳐 빈 항목을 제거할 수 있습니다.( \{0,1\}- 0~1회 발생)- 대상 문자를 밝히고 대체하거나 그 자체로 대체할 때까지 - 쌍 사이에 나타나는 문자와 마찬가지로 ().

관련 정보