입력하다 - -
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>
해당 컨텍스트에서 특별한 의미가 손실되도록 지정합니다.