sed에서 AWORD 또는 BWORD를 CWORD로 바꾸세요.

sed에서 AWORD 또는 BWORD를 CWORD로 바꾸세요.

따라서 다음 유형의 임의 웹사이트 목록이 있습니다.

   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 cusing을 일치시킬 수 있다는 것을 알고 있지만 [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.netOR .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 ' 

관련 정보