bash 스크립트와 grep/awk/sed를 사용하여 단일 문자 구분 기호가 있는 알려진 패턴과 일치하는 줄을 어떻게 배열로 분할할 수 token1;token2;token3;token4
있습니까 a[0] = token1
?a[3]=token4
답변1
고쳐 쓰다이 방법으로 배열을 생성하는 것은 IFS가 공백이 아닌 단일 문자인 경우에만 적합합니다.그리고데이터 문자열에는 연속된 여러 구분 기호가 없습니다.
이 문제에 대한 해결책 및 유사한 해결책을 보려면 여기로 이동하십시오.유닉스와 리눅스 문제...(IFS에 대한 더 깊은 이해를 위해 읽어볼 가치가 있습니다.
IFS
(내부 필드 구분 기호) bash(및 ash, ksh, zsh와 같은 기타 POSIX 셸)를 사용합니다 .
삽입된 공백만 허용하는 IFS를 사용하면 외부 호출을 피할 수 있습니다.
# ==============
A='token0:token1:token2.y token2.z '
echo normal. $A
# Save IFS; Change IFS to ":"
SFI=$IFS; IFS=: ##### This is the important bit part 1a
set -f ##### ... and part 1b: disable globbing
echo changed $A
B=($A) ### this is now parsed at : (not at the default IFS whitespace)
echo B...... $B
echo B[0]... ${B[0]}
echo B[1]... ${B[1]}
echo B[2]... ${B[2]}
echo B[@]... ${B[@]}
# Reset the original IFS
IFS=$SFI ##### Important bit part 2a
set +f ##### ... and part 2b
echo normal. $A
# Output
normal. token0:token1:token2.y token2.z
changed token0 token1 token2.y token2.z
B...... token0
B[0]... token0
B[1]... token1
B[2]... token2.y token2.z
B[@]... token0 token1 token2.y token2.z
normal. token0:token1:token2.y token2.z
답변2
두 가지 주요 방법이 있습니다. 하나는 IFS
,Fred.bear가 시연함. 이는 별도의 프로세스가 필요하지 않다는 장점이 있지만, 입력에 셸에 특별한 의미를 갖는 문자가 포함되어 있을 경우 올바르게 입력하는 것이 어려울 수 있습니다. 또 다른 방법은 텍스트 처리 유틸리티를 사용하는 것입니다. 필드 분할은 에 내장되어 있습니다 awk
.
input="token1;token2;token3;token4"
awk -vinput="$input" 'BEGIN {
count = split(input, a, ";");
print "first field: " a[1];
print "second: field" a[2];
print "number of fields: " count;
exit;
}'
awk는 여러 입력을 처리할 때 특히 적합합니다.
command_producing_semicolon_separated_data |
awk -F ';' '{
print "first field: " $1;
print "second field: " $2;
print "number of fields: " NF;
}'
답변3
$ str="token1;token2;token3;token4"
$ echo $str
token1;token2;token3;token4
$ echo $str | tr ';' ' '
token1 token2 token3 token4
$ arr=( $(echo $str | tr ';' ' ') ) # Populate the tokens into an array
$ echo ${arr[0]} # Access items by index
token1
$ echo ${arr[2]}
token3
$ echo ${arr[1]}
token2
$ echo ${#arr[@]} # Length of the array
4