모든 숫자를 "@" 기호로 바꾸고 싶습니다. 아래 sed 명령을 사용하고 있지만 원하는 결과를 얻지 못했습니다.
주문하다 -
echo "abc 434 pankaj 444" | sed 's/[0-9]*/@/g'
결과 -
@a@b@c@ @ @p@a@n@k@a@j@ @
답변1
음, 간단합니다. [0-9]*
전체가 다음으로 구성된 문자열과 일치합니다.0 이상빈 문자열을 포함한 숫자. 빈 문자열과 일치하는 모든 항목은 두 문자 간에 일치하므로 @
입력의 모든 문자 사이에 대체가 추가됩니다. @
표현식은 연속된 모든 숫자를 한 번에 일치시키므로 여러 자리의 문자열은 한 자리로 대체됩니다.
따라서 입력 문자열에서 ab43
일치 항목은 다음과 같습니다 [0-9]+
(명확성을 위해 일부 공백이 추가됨).
a b 434
^ ^ ^^^- here, a string of some digits
^ ^- here, a zero-length string
^- here, a zero-length string
[0-9]
정확히 한 자리 숫자와 일치하거나 [0-9][0-9]*
하나 이상의 숫자(또는 [0-9]+
확장 정규식)와 일치하는 데 사용됩니다 .
답변2
각 숫자를 다음으로 대체하십시오.@
echo "abc 434 pankaj 444" | sed 's/[0-9]/\@/g'
#Output: abc @@@ pankaj @@@
또는 각각을 number
다음으로 대체하십시오.@
echo "abc 434 pankaj 444" | sed 's/[0-9]\+/\@/g'
#Output: abc @ pankaj @
필요한 출력에 따라 다름
답변3
echo "abc 434 pankaj 444"| tr "[0-9]" "@"
abc @@@ pankaj @@@
답변4
숫자 또는 정수(연속 숫자)를 바꿀지 여부에 따라 옵션 없이 또는 옵션과 함께 명령을 @
사용할 수 있습니다 .tr
-s
$ echo "abc 434 pankaj 444" | tr '[:digit:]' '[@*]'
abc @@@ pankaj @@@
$ echo "abc 434 pankaj 444" | tr -s '[:digit:]' '[@*]'
abc @ pankaj @
옵션을 사용 하면 유틸리티가 두 번째 인수에 나타나는 데이터의 연속 문자를 "압착"합니다 -s
. tr
이 경우 -s
문자를 단일 문자로 tr
결합하여 사용합니다 .@
@
이 두 매개변수는 숫자를 문자로 바꾸라고 지시 [:digit:]
합니다 . 대부분의 (모두?) 구현에서는 두 번째 인수로 대체 항목을 작성할 수 있습니다 . 문자 그대로 " 첫 번째 인수에서 설명하는 집합에 있는 문자 수만큼"을 의미합니다.[@*]
tr
@
tr
@
[@*]
[@*]
@
유효한 경우 tr
입력에 이미 존재하는 연속 문자가 압축됩니다.@
-s
0개 이상의 숫자가 일치하는 문자를 삽입했기 때문에 메서드가 sed
예상대로 작동하지 않습니다 . @
입력의 각 문자 사이에는 숫자가 0이므로 표현식은 각 문자 간에 일치합니다.
올바르게 작동하고 연속된 숫자를 단일 숫자로 바꾸는 수정된 대체는 다음 @
과 같습니다.
sed 's/[[:digit:]]\{1,\}/@/g'
\{1,\}
대신 in *
(자체는 과 동일함 )을 사용하면 \{0,\}
앞의 표현식이 적어도 하나 이상 일치하도록 강제합니다. 확장된 정규 표현식의 형태로 \{1,\}
작성된 내용을 볼 수 있습니다.+
\{1,\}
표현식에서 숫자를 제거하고 대체값을 로 남겨 두어 s/[[:digit:]]/@/g
각 개별 숫자를 로 바꿀 수 있습니다 @
.