10,000줄의 파일이 있고 각 줄 끝에 숫자가 있습니다. 예를 들면 다음과 같습니다.
asdf ggg ١
gghh rtt ٣٢٥
tyyu bnnn jigff ٢٧
모든 숫자의 자릿수를 역순으로 배열하세요. 올바른 순서는 다음과 같습니다.
asdf ggg ١
gghh rtt ٥٢٣
tyyu bnnn jigff ٧٢
각 행의 숫자 순서를 바꾸도록 도와주실 수 있나요?
동부 아랍어숫자:
(٠, ١, ٢, ٣, ٤, ٥, ٦, ٧, ٨, ٩)
답변1
펄 사용:
$ perl -CSD -pe 's/(\d+)$/reverse($1)/e' file
asdf ggg ١
gghh rtt ٥٢٣
tyyu bnnn jigff ٧٢
그러면 각 입력 줄에 대체 명령이 적용됩니다. 줄 끝과 일치하는 숫자 문자열을 바꿉니다. 일치하는 숫자 문자열이 무엇이든 이 reverse()
함수는 이를 반전시킵니다. 복원된 결과는 대체에서 대체 텍스트로 사용됩니다.
후행은 Perl이 명령을 평가되는 것으로 /e
처리하도록 합니다 .reverse($1)
UTF-8 I/O를 활성화하는 -CSD
옵션입니다 .perl
답변2
사용행복하다(이전 Perl_6)
~$ raku -pe 's/ (\d+) $ /{flip($0)}/;' file
또는
~$ raku -pe 's/ (\d+) $ /{$0.flip}/;' file
입력 예:
asdf ggg ١
gghh rtt ٣٢٥
tyyu bnnn jigff ٢٧
예제 출력:
asdf ggg ١
gghh rtt ٥٢٣
tyyu bnnn jigff ٧٢
위의 Raku 솔루션은 이미 게시된 Perl 솔루션과 유사하지만 한 가지 중요한 차이점은 기본적으로 Raku에서 유니코드가 잘 처리된다는 것입니다(기억할 추가 명령줄 플래그가 없음). 캡쳐는 $0
라쿠부터 시작됩니다. Raku의 키워드는 약간 다릅니다(더 정확합니까?). 문자열의 문자를 바꾸려면 키워드를 사용하고 flip
, 목록의 순서를 바꾸려면 키워드를 사용합니다 reverse
.
{ … }
정규식의 코드 블록은 중괄호로 표시됩니다. Raku를 배울 때 /e
Perl(5) 플래그를 사용하면 좋은 메시지를 받게 됩니다.
Unsupported use of /e. In Raku please use: interpolated {...} or s{} =
... form
https://docs.raku.org/언어/unicode
https://docs.raku.org/언어/regexes
https://raku.org