문자 앞의 모든 항목을 삭제하려면(예: "(") 이렇게 합니다 '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회 발생)- 대상 문자를 밝히고 대체하거나 그 자체로 대체할 때까지 - 쌍 사이에 나타나는 문자와 마찬가지로 ()
.