아래 문자열이 있습니다.
/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
주요 문제 외에 너무 많은 문제가 있습니다.
ambiguous redirect
왜냐하면코드에 큰따옴표가 없습니다.- 리디렉션은
<
파일에서 데이터를 가져옵니다. 문자열이 파일(경로)을 가리키지 않습니다. Bash에서는<<<
. function
예약어입니다. 함수에 이름을 붙이는 방법이 있지만function
이후 사용이 불편합니다.- (귀하의 의견에 있는 용어) 함수는 자식이 아닙니다.
- 가 아닌 이름으로 함수를 호출합니다
bash -c
.다른 질문에 대한 내 대답적용됩니다. $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
대신 사용하십시오 .tr
그readarray …
줄은 다음과 같습니다: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
.