텍스트 줄에서 태그 추출 [닫기]

텍스트 줄에서 태그 추출 [닫기]

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

관련 정보