따라서 다음 유형의 임의 웹사이트 목록이 있습니다.
rapido21655bonk.a.sweetpotato.net
rapido26230bonk.a.sourpotato.net
rapido29926bonk.b.sourpotato.net
rapido29926bonk.b.sweetpotato.net
rapido30179bonk.a.sweetpotato.net
rapido30648bonk.b.sourpotato.net
rapido30761bonk.c.sweetpotato.net
이제 숫자만 유지하고 다른 모든 것을 제거하려면 sed 문자열이 필요합니다. 내가 한 일은 첫 번째 부분을 삭제하는 것입니다 . 두 번째 부분에서는 sed를 두 번 사용하여 삭제할 수 있지만 일부 논리를 사용하여 하나의 sed로 삭제할 sed s/rapido//
수 있는지 알고 싶습니다 . or
나는 sed를 사용하여 a or b or c
using을 일치시킬 수 있다는 것을 알고 있지만 [abc]
전체 단어와 일치하는 것과 비슷한 것을 원합니다. 그래서 제가 다음에 한 일은 다음과 같습니다.
sed s/rapido//|sed s/bonk.[abc].sweetpotato.net//
그런 다음 Sourpotato.net을 사용하여 또 다른 것을 추가했지만 다음을 수행할 수 없는 것 같습니다.
sed s/rapido//|sed s/bonk.[abc].(sweet|sour)potato.net//
이것은 작동하지 않습니다. 그것은 나에게 이것을 제공합니다 :(
-bash: syntax error near unexpected token
''
rapido22452boonkers.red
때로는 내가 거기에 보관하고 싶은 것과 같은 것을 얻을 수 있기 때문에 번호를 바꾸는 것만으로는 작동하지 않습니다 . 2개의 대안을 제거하고 싶습니다 . sweetpotato.net
OR .sourpotato.net
[111@111 ~]$ sed s/rapido// sedster|sed 's/bonk.[abc].(sweetpotato|sourpotato).net//'
21655bonk.a.sweetpotato.net
26230bonk.a.sourpotato.net
29926bonk.b.sourpotato.net
29926bonk.b.sweetpotato.net
30179bonk.a.sweetpotato.net
30648bonk.b.sourpotato.net
30761bonk.c.sweetpotato.net
답변1
숫자만 추출하려면 GNU를 사용하여 다음을 수행할 수 있습니다 grep
.
$ grep -oP '\d+' file
21655
26230
29926
29926
30179
30648
30761
또는 포팅을 위해 Perl을 사용하십시오.
$ perl -pe 's/[^\d\n]+//g' file
21655
26230
29926
29926
30179
30648
30761
또는 sed
:
$ sed -nE 's/[^0-9]+//gp' file
21655
26230
29926
29926
30179
30648
30761
보다 구체적인 입력 데이터가 필요한 경우 다음을 시도해 볼 수 있습니다.
$ sed -nE 's/.*rapido([0-9]+)bonk\..\.(sweet|sour)potato.net.*/\1/p' file
21655
26230
29926
29926
30179
30648
30761
답변2
그리고
sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/\2/g'
가운데 숫자만 유지하시면 됩니다. 이는 확장 정규식에서만 작동하므로 를 -r
선택 해야 합니다 sed
.
사실 한번만 써도 충분해요
sed -r 's/([^0-9]*)([0-9]*)(.*)/\2/g'
\1
이는 표현식의 일부를 , ...로 인용하는 기능을 사용하며 인용하려는 표현식 부분 주위에 괄호를 사용해야 \2
합니다 . (...)
위 코드에서 두 번째 부분은 ([0-9]*)
중간에 있는 숫자와 일치하며, 로 참조할 수 있습니다 \2
.
편집하다:terdon이 지적했듯이 초기 부분은 다시 사용하지 않으므로 캡처할 필요가 없습니다. 그래서
sed -n -r 's/[^0-9]*([0-9]+).*/\1/p'
충분한.
대체로 위 명령은첫 번째행에 숫자를 입력하세요.
답변3
당신의 시도
sed s/rapido// | sed s/bonk.[abc](sweet|sour)potato.net//
실제로는 꽤 비슷하지만 두 가지 실수를 저질렀습니다. 첫째, 명령을 따옴표로 묶지 않았기 때문에 bash
특수 문자 "(" 및 "|"가 해석되었습니다. (bash 오류 메시지를 받았다는 사실을 통해 이에 대한 정보를 얻을 수 있었을 것입니다).
두 번째 오류는 더 미묘합니다. Sed
그리고 grep
사용기초적인몇 글자만 사용한 정규식(. * ^ $ [ ])에는 특별한 의미가 있습니다. 사용하고 싶다면확장하다정규식 연산자(| (){}) 앞에 백슬래시를 붙여야 합니다. 따라서 명령은 다음과 같아야 합니다.
sed < t 's/rapido//' | sed 's/bonk.[abc].\(sweet\|sour\)potato.net//'
sed
한 번의 실행으로 여러 명령을 처리할 수 있으므로 이를 다음과 같이 단순화할 수 있습니다 .
sed < t 's/rapido//; s/bonk.[abc].\(sweet\|sour\)potato.net//'
답변4
숫자를 제외한 모든 것을 제거하려면tr
해결책은 다음과 같습니다.
x='21655bonk.a.sweetpotato.net
26230bonk.a.sourpotato.net
29926bonk.b.sourpotato.net
29926bonk.b.sweetpotato.net
30179bonk.a.sweetpotato.net
30648bonk.b.sourpotato.net
30761bonk.c.sweetpotato.net'
printf '%s\n' "$x" | tr -d '[:alpha:].'
21655 26230 29926 29926 30179 30648 30761
또는
printf '%s\n' "$x" | tr -cd '0-9 '