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
다음 구성 요소로 구성됩니다.
s/search_pattern/new_pattern/options
- 교체(검색 및 교체)[]
- 정규식.*
- 와일드카드 문자가 0개 이상 발생합니다.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)