Unix 스크립트에 문제가 있습니다

Unix 스크립트에 문제가 있습니다

입력하다 - -

System:root,bin,user,saaa

출력 표시----

System,root
System,bin
System,user
System,says

이 출력을 얻는 방법은 무엇입니까?

답변1

그것을 사용하는 것이 좋지만 perl쉘 스크립트를 지정했기 때문에 ...

1단계: 문자에 따라 줄을 두 부분으로 나눕니다 :. cut명령 또는 ${parameter#word}구조 를 사용하십시오 ${parameter%word}.

2단계: 행의 두 번째 부분을 역할에 따라 여러 부분으로 나눕니다 ,. 해당 awk명령을 사용하세요 - 얼마나 많은 블록을 갖게 될지 알려줄 것입니다. (저는 전문가가 아니기 awk때문에 이것이 제가 생각하는 대로 작동할지는 잘 모르겠습니다.)

3단계: 2단계에서 얻은 부품을 반복하여 1단계의 첫 번째 부품에 부착한 다음 인쇄합니다.

답변2

입력 줄에 정확히 하나의 콜론( :)이 포함되어 있고, ,콜론 앞에 쉼표( )가 올 수 없으며, 쉼표와 콜론 모두 추출된 하위 문자열의 일부가 될 수 없다고(이스케이프되지도 않음) 가정할 수 있다면, 간단한 awk스크립트로 충분할 수 있습니다.

$ printf '%s\n' 'System:one,two,three' |
    awk -v FS=':|,' '{ for (i=2;i<=NF;i++) { print $1","$i } }'

산출:

System,one
System,two
System,three

필드 구분 FS기호는 :모든 문자 또는 ,.


대신 첫 번째 출력 필드로 첫 번째 콜론(쉼표 포함) 앞의 모든 항목을 선택하고 입력 줄의 나머지 부분을 쉼표로 분할하려는 경우(쉼표가 일부로 남아 있지 않다고 가정) 하위 문자열(없음에도 불구하고) 이스케이프)), 제안된 대로 쉘 기능을 사용할 수 있습니다.하이미의 대답:

$ printf '%s\n' 'System:one,two,three' |
    while IFS= read -r rem; do      # IFS= to preserve blank characters
      first=${rem%%:*}              # Remove from the first ':' on
      rem=${rem#"$first"}           # Remove first from the beginning of rem
      rem=${rem#:}                  # Strip the remaining ':' at rem's beginning
      while test "$rem"; do         # Exit when rem is empty
          second=${rem%%,*}         # Remove from the first ',' on
          rem=${rem#"$second"}      # Remove second from the beginning of rem
          rem=${rem#,}              # Strip the remaining ',' at rem's beginning
          printf '%s\n' "$first,$second"
      done
    done

그냥 이해했는지 확인하세요쉘 루프를 사용하여 텍스트를 처리할 때 주의할 사항.

또는 GNU를 사용하십시오 sed.

$ printf '%s\n' 'System:one,two,three' |
sed -n '
  :l1
    s/^[^:]*:\n//g;
    t l2;
  s/^\([^:]\{1,\}\):\([^,\n]\{1,\}\)*,\{0,1\}\(.*\)$/\1:\3\n\1,\2/;
    t l1;
  q;
  :l2 p;
'

여기서는 분기( t)에서 레이블( l1)까지를 사용하여 루프를 통해 입력의 각 행을 처리합니다. 한 번에 하나씩 첫 번째 :와 첫 번째 다음 사이의 하위 문자열이 ,패턴 공간에 새 줄로 추가되고 첫 번째 이전 하위 문자열 뒤에 연결됩니다 :. 추출할 하위 문자열이 더 이상 없으면 원래 문자열의 나머지 부분이 제거되고 패턴 공간이 인쇄되고 프로그램이 종료됩니다.

(GNU sed버전 >= 4.6의 경우 options 를 사용하여 호출하여 진행 상황을 단계별로 확인할 수 있습니다 --debug).

\n내부 대괄호 표현식을 사용하여 문자를 일치시키는 것 (여기서는 부정 일치) <newline>은 표준이 아닙니다. POSIX는 <backslash>해당 컨텍스트에서 특별한 의미가 손실되도록 지정합니다.

관련 정보