다음과 같은 문자열이 있습니다.
Grades ABCDEF-123456
이 문자열을 아래와 같이 두 부분으로 나누고 싶습니다.
Grades ABCDEF
Grades 123456
Bash에서 어떻게 할 수 있나요?
답변1
echo Grades "ABCDE-12345" | sed 's/-/ /g' | awk '{ print $1" "$2"\n"$1" "$3'}
Grades ABCDE
Grades 12345
아니면 @steeldriver에 따르면
awk -F'[ -]' '{print $1, $2; print $1, $3}'
답변2
셸에서 이 작업을 완전히 수행할 수도 있습니다.
text="Grades ABCDEF-123456"
본문을 분할합니다. 원하는 경우 캡처할 수 있지만 여기서는 삭제합니다.
grades="${text#* }"
이제 이 두 부분을 변수로 추출할 수 있지만 지금은 인쇄만 하면 됩니다.
echo "Grades ${grades%-*}"
echo "Grades ${grades#*-}"
하나의 출력 문으로 결합할 수도 있지만 읽기가 쉽지 않다고 생각합니다( printf
일부 텍스트 범주보다 안전하더라도).echo
printf "Grades %s\nGrades %s\n" "${grades%-*}" "${grades#*-}"
답변3
대시를 개행 문자로 바꾸고 그 뒤에 첫 번째 필드를 입력하면 됩니다.
perl -alpe 's/-/\n$F[0] /'
답변4
사용행복하다(이전 Perl_6)
~$ raku -ne 'my @a = .split("-", 2); put "@a.[0]\n", @a.[0].words[0], " @a.[1]";' file
Grades ABCDEF
Grades 123456
#OR:
~$ raku -ne '.split("-", 2) andthen put "$_.[0]\n", $_.[0].words[0], " $_.[1]";' file
Grades ABCDEF
Grades 123456
Raku는 Perl 계열의 프로그래밍 언어입니다. Raku에는 Perl보다 명령줄 플래그가 더 적습니다. 위의 라쿠 단선은 -ne
자동 인쇄되지 않은 선으로 표시되어 있다고 합니다.
첫 번째 답변: 한 줄씩 입력하면 하이픈 .split
으로 부분을 -
나누어 배열에 할당합니다. 이는 테마 변수(이 경우 라인 텍스트) 에 대한 루틴을 호출하는 약어 입니다. 배열 에 들어가면 데이터를 올바른 출력 형식으로 조정하기만 하면 됩니다. Raku의 루틴은 여백의 텍스트를 끊습니다. 따라서 최종 호출은 다음과 같이 이해될 수 있습니다.2
@a
.split
$_.split
$_
@a
words
put
"@a.[0]\n"
첫 번째 요소를 인쇄하고@a
그 뒤에 개행 문자를 인쇄합니다.@a.[0].words[0]
다음 줄에 첫 번째 요소의 첫 번째 단어를 인쇄합니다." @a.[1]"
같은 (두 번째) 줄에공백을 인쇄한 다음 두 번째 요소를 인쇄합니다
@a
.
두 번째 답변: 사용하기 편리하다고 생각되면$_
주제 변수, 배열 할당을 포기하고 동일한 출력을 얻을 수 있습니다. 위의 두 번째 답변에서는 $_
선택 사항이며 코드를 더욱 단축할 수 있습니다. 필요한 것은 주제 변수에서 루틴/인덱스를 호출 .
하려는 것을 Raku에서 이해하는 주요 지점 뿐입니다.$_
마지막으로 다양한 텍스트 조각에 주요 "접두사"를 추가하는 것은 일반적인 작업입니다. 키/값 쌍이 만족스럽고 기본 순서를 적용할 수 있는 경우 다음 코드는 개념적으로 더 간단할 수 있습니다( \t
구분된 열 반환).
~$ raku -ne 'my %hash = .words[0] => .words[1].split("-", 2); \
for %hash.sort {.antipairs.put for .invert };' file
Grades ABCDEF
Grades 123456
https://docs.raku.org/routine/split
https://docs.raku.org/routine/invert
https://raku.org