sed, awk, perl 또는 bash를 사용하여 문자열을 두 부분으로 나눕니다.

sed, awk, perl 또는 bash를 사용하여 문자열을 두 부분으로 나눕니다.

다음과 같은 문자열이 있습니다.

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$_@awordsput

  1. "@a.[0]\n"첫 번째 요소를 인쇄하고 @a그 뒤에 개행 문자를 인쇄합니다.
  2. @a.[0].words[0]다음 줄에 첫 번째 요소의 첫 번째 단어를 인쇄합니다.
  3. " @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

관련 정보