sed를 사용하여 숫자를 "@"으로 바꾸면 각 문자 사이에 "@"가 삽입됩니다.

sed를 사용하여 숫자를 "@"으로 바꾸면 각 문자 사이에 "@"가 삽입됩니다.

모든 숫자를 "@" 기호로 바꾸고 싶습니다. 아래 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각 개별 숫자를 로 바꿀 수 있습니다 @.

관련 정보