Linux에서 구분 기호를 사용하여 하위 문자열을 어떻게 구분할 수 있나요?

Linux에서 구분 기호를 사용하여 하위 문자열을 어떻게 구분할 수 있나요?

아래 문자열이 있습니다.

/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand

저는 리눅스 초보자입니다. "|"를 사용하여 어떻게 구분할 수 있나요? 구분 기호로 사용하고 변수에 할당하시겠습니까? 전체 문자열을 매개변수로 전달하고 있으며 필드를 별도로 분할\절단해야 합니다.

예를 들어:

function()
{
while read -r record; do
## here i need the fields to cut the fields and assign to a variable #####
done < $0 
}

bash -c function "/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand"

위의 예를 시도했을 때 오류가 발생했습니다 $0: ambiguous redirect.

답변1

tr구분 기호를 사용하여 구분할 수 있습니다 .

다음 예에서는 다음 |으로 대체합니다.newline

variable=$(echo "/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand" | tr "|" "\n")

echo $variable

당신은 또한 사용할 수 있습니다

echo yourtext | tr -d "|"

보다tr 명령

답변2

주요 문제 외에 너무 많은 문제가 있습니다.

  1. ambiguous redirect왜냐하면코드에 큰따옴표가 없습니다.
  2. 리디렉션은 <파일에서 데이터를 가져옵니다. 문자열이 파일(경로)을 가리키지 않습니다. Bash에서는 <<<.
  3. function예약어입니다. 함수에 이름을 붙이는 방법이 있지만 function이후 사용이 불편합니다.
  4. (귀하의 의견에 있는 용어) 함수는 자식이 아닙니다.
  5. 가 아닌 이름으로 함수를 호출합니다 bash -c.다른 질문에 대한 내 대답적용됩니다.
  6. $1그런 다음 첫 번째 인수는 가 아닌 으로 참조됩니다 $0.

이 코드는 작동하지만 정확히 원하는 코드인지는 확실하지 않습니다.

#!/bin/bash

split_string ()
{
   readarray -t arrayv < <(tr '|' '\n' <<< "$1")
}

split_string '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand'

# now arrayv is an array variable (indexed from 0)
# retrieving few values
echo "${arrayv[0]}"
echo "${arrayv[5]}"
echo "${arrayv[9]}"

노트:

  • 문자열을 큰따옴표로 묶었습니다. 큰따옴표 안의 문자열은 특정 확장을 겪는다는 것을 기억하세요. 문자열에는 확장되거나 확장될 수 있는 내용이 포함되어 있지 않으므로(예: $), 이 특별한 경우에는 큰따옴표를 사용해도 됩니다. 일반적으로 확장을 억제하려면 작은따옴표를 사용합니다.
  • readarray의 동의어입니다 mapfile. help mapfile학습하려면 호출하세요 .
  • 기타 연구용 사료:<<<,<( … ),배열.
  • export환경에 배열 변수를 적용할 수 있는 방법은 없습니다 .
  • readarray구분 기호로 사용하라고 말할 수 있습니다 |.

     readarray -t -d '|' arrayv <<< "$1"
    

    그러나 마지막 "필드"에는 후행 개행 문자가 포함됩니다(작동 방식 때문에 표시됨 <<<). 를 사용하여 모든 구분 기호를 개행 문자로 바꾼 tr다음 readarray기본 설정(개행 문자를 구분 기호로 사용)을 사용합니다.

  • 공백은 구분 기호에 속하지 않으며 저장된 값의 일부가 됩니다. 인접한 공백이 있는 구분 기호의 하위 문자열을 단일 개행 문자로 바꾸려면 sed대신 사용하십시오 . trreadarray …줄은 다음과 같습니다:

    readarray -t arrayv < <(sed 's/ *| */\n/g' <<< "$1")
    
  • 해당 기능을 한 번만 사용하려는 경우에는 기능이 전혀 필요하지 않습니다. 다음 줄(함수 외부)이 작업을 수행합니다.

    readarray -t arrayv < <(tr '|' '\n' <<< '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand')
    

    당신이 함수를 정의하려고 했기 때문에 함수를 정의한 다음 딱 한 번만 사용했습니다.

  • 입력 문자열이 고정된 수의 필드로 구성되고 필드에 의미가 있는 경우 이름에 의미가 있는 다른(배열이 아닌 일반) 변수에 해당 필드를 할당하는 것이 좋을 수 있습니다. 예:

    IFS='|' read -r path1 path2 path3 path4 path5 ip path6 wtf1 wtf2 wtf3 extra < <(sed 's/ *| */|/g' <<< '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand')
    echo "$ip"
    echo "$wtf3"
    

    특정 참고사항:

    • 여기서는 |구분 기호로 명시적으로 사용합니다. 를 사용할 때 read후행 줄 바꿈(특정 리디렉션 및 도구 작동 방식으로 인해 표시됨)은 무해할 뿐만 아니라 필수입니다.
    • 변수 를 추가했습니다 extra. 예상보다 더 많은 필드가 있으면 과도한 필드가 차지하게 됩니다 extra. extra그들 없이는 영향을 미칠 것입니다 $wtf3.
    • 이러한 변수를 사용할 수 있습니다 export.
  • foo|bar|baz|…(또는 foo | bar | baz | …유사한) 형식으로 (많은) 레코드를 포함하는 파일/스트림을 조작하려는 경우 awk.

관련 정보