유닉스에서 sed 's/[^0-9]*//g' 명령은 무엇을 의미합니까?

유닉스에서 sed 's/[^0-9]*//g' 명령은 무엇을 의미합니까?

Unix 쉘 스크립트를 보고 있었는데 다음 명령을 발견했습니다.

sed 's/[^0-9]*//g'

누군가 이것을 설명할 수 있나요?

답변1

주문하다

sed 's/[^0-9]//g'

숫자만 통과시키는 필터와 같습니다.

그래서 그럴 것이다

sed 's/[^0-9]*//g'

g그러나 결국 에는 *그럴 필요가 없습니다(자세한 내용은 다음과 같습니다).

정규식은 [^0-9]"숫자가 아닌 모든 문자"를 의미하고 sed명령은 s/[^0-9]//g"숫자가 아닌 문자를 null로 바꾼 다음 각 입력 줄에서 가능한 한 많이 반복합니다(즉, 숫자가 아닌 첫 번째 문자뿐만 아니라)를 의미합니다. 문자) 한 줄)".

예:

$ echo '1-2 1-2? Is this mic on? Hello world! It is 2018!' | sed 's/[^0-9]//g'
12122018

명령어랑 똑같네요

tr -dc '0-9\n'

또한 입력에서 숫자가 아닌 문자를 제거합니다(그리고 개행 문자도 보존합니다).


[^0-9]와 의 차이점은 [^0-9]*전자는 숫자가 아닌 문자 하나만 일치하고 후자는 0개 이상의 숫자가 아닌 문자와 일치한다는 것입니다. 네가 원한다면숫자가 아닌 숫자 제거, 빈 문자열(위의 "0개 이상"의 "0")과 일치하는 것을 원하지 않으므로 [^0-9]match하는 것이 더 합리적입니다 [^0-9]*.

g명령 끝에 있는 플래그는 sed"전역적으로"를 의미합니다. 즉, 첫 번째 발생뿐만 아니라 줄의 모든 위치를 의미합니다. 이것을 제거하면 알 수 있습니다

$ echo '123 testing' | sed 's/[^0-9]*//'
123 testing

선행 공백과 일치하며 1아무것도 대체하지 않습니다. 보다 직관적인 예:

$ echo '123 testing' | sed 's/[^0-9]*/(&)/'
()123 testing

... g마침내:

$ echo '123 testing' | sed 's/[^0-9]*/(&)/g'
()1()2()3( testing)

그럼 우리는

$ echo '123 testing' | sed 's/[^0-9]//'
123testing

숫자가 아닌 공백과 일치하고 대체됩니다. 보다 직관적인 예:

$ echo '123 testing' | sed 's/[^0-9]/(&)/'
123( )testing

... g마침내:

$ echo '123 testing' | sed 's/[^0-9]/(&)/g'
123( )(t)(e)(s)(t)(i)(n)(g)

답변2

sed 's/[^0-9]*//g'숫자가 아닌 문자를 제거한다는 의미입니다.

echo alsal34las | sed sed 's/[^0-9]*//g'

얻을 것이다34

더 알고 싶으시면 확인해 보시는 걸 추천드려요정규식.

답변3

직접적인 답변——영숫자 텍스트에서 숫자가 나타날 때마다 검색하여 제거합니다.

설명하다 -

 sed 's/[^0-9]*//g' filename

다음 구성 요소로 구성됩니다.

  1. s/search_pattern/new_pattern/options- 교체(검색 및 교체)
  2. [] - 정규식.
  3. * - 와일드카드 문자가 0개 이상 발생합니다.
  4. g - 전역(하나의 옵션 - 줄의 모든 항목을 대체)

각 구성 요소를 이해해 봅시다

1. sed 's/search_pattern/new_pattern/options' 파일 이름

sed 's/akshat/saxena/' 파일.txt

이는 "akshat" 패턴의 모든 행을 검색하고 file.txt라는 파일에서 처음 나타나는 패턴만 "saxena"로 바꿉니다.

여기서는 g(전역), i(대소문자 무시) 등과 같은 옵션을 제공할 수 있습니다.

 (i) g(global)
         Discussed in point 4.

 (ii)  i - searches ignoring case (case- insensitive search)
  
   sed ' s/life/love/i' file.txt

  Replace life/Life/lIfe/liFe/life/lifE (and many more) with love

2. []를 이용한 정규식

정규식에서는 다양한 값 조합이나 범위를 검색할 수 있습니다.

 sed 's/[Li][Ii][Ff][Ee]/love/g' file

패턴에 L 또는 l, I 또는 i, F 또는 f, E 또는 e가 있음을 나타냅니다. 따라서 대소문자를 구분하지 않는 검색이 됩니다.

범위가 필요한 경우 대시(-)를 사용하세요. [az]는 a부터 z까지의 소문자, 즉 모든 알파벳 문자를 나타냅니다. [0-9]는 0~9, 즉 모든 숫자를 나타냅니다.

따라서 주어진 코드에서는 모든 숫자 문자를 검색하는 것을 의미합니다.

삼.*

어떤 캐릭터라도 그 자리를 차지할 수 있습니다. 따라서 주어진 코드에서 모든 문자는 정규식 [0-9]를 따를 수 있습니다.

4.g(글로벌)

   replace all occurrence in that line.
    
       Inorder to replace first occurence in particular line use
           

sed 'ns/akshat/$$/' 파일

       where n is the line number. 

위 코드는 n행의 "akshat" 패턴을 $$로 바꿉니다.

답변4

틀림없이,

sed 's/[^0-9]*//g

sed파이프( ) 끝에 배치하거나 |, ​​리디렉션(예: <<<에서와 같이) sed 's/[^0-9]*//g' <<< 'yourstring123'하거나, 파일에서 직접 사용(예: sed 's/[^0-9]*//g' /your/filename.

sed의 명령은 s"교체"를 참조하며 문자를 바꾸는 데 사용됩니다.

$ sed 's/pattern/replacment/' <<< 'pattern123pattern'
replacement123pattern

g끝에 있는 수정자는 "전역"을 의미하며 전체 줄을 대체하는 데 사용됩니다.

$ sed 's/pattern/replacement/g' <<< 'pattern123pattern'
replacement123replacement

[^0-9]*정규식, 이것이 이 명령의 마법입니다.

[: begin matching
 ^: NOT these characters:
  0-9: 0 through 9
]: end match
*: match 0 or more occurances

예를 들어, [^0-9]*0에서 9 사이의 숫자가 아닌 모든 것과 일치합니다.

sed 's/[^0-9]*//g': 숫자가 아닌 모든 문자를 빈 문자열('')로 바꿉니다.

$ sed 's/[^0-9]*//g' <<< 'pattern123pattern'
123
$ sed 's/[^0-9]*//g' <<< '123qwertyui456opasdfghjklzxcvbnm789,./;[]=`~012+:"{}<>?345'
123456789012345

자세한 내용은 man sed(1)및 를 참조하세요.regex(7)

관련 정보