파일을 구문 분석할 때 토큰 삽입 - bash

파일을 구문 분석할 때 토큰 삽입 - bash

다음과 같은 구조의 파일이 있습니다.

ma${token}jid-azimi-865131021
javad-ya${token}rip-865132012

이것은 내 프로그램입니다:

IFS="-"

token="12345678"

cat input.txt | while read col1 col2 col3; do
    echo ${col1}
    echo ${col2}
    echo ${col3}
    echo "********************************"
done 

${token}파일을 읽는 중에 삽입 하고 싶습니다 . 토큰은 동적 단어이기 때문에 파일에서 매번 변경할 수는 없습니다. 그래서 ${token}일단 파일에 추가해봤습니다 . 그러나 프로그램의 출력은 다음과 같습니다.

ma${token}jid
azimi
865131021
********************************
javad
ya${token}rip
865132012
********************************

왜 이런 일이 발생합니까? ma${token}jid다음과 같이 확장한 echo ma${token}jid다음 12345678삽입해야 합니다.

답변1

에코된 변수는 변수 확장의 영향을 받지 않습니다. eval앞에 추가합니다 . 간단한 경우에는 작동할 수 있지만 echo문자열에 또는 따옴표가 포함되어 있으면 |깨질 수 있습니다 . 아니면 다음을 교체하세요.

echo ${col1/'${token}'/$token}

답변2

값은 col113자 문자열 입니다 ma${token}jid. 따옴표 없이 작성 하면 echo ${col1}셸은 ${col1}변수 값을 대체한 다음 토큰화(즉, $IFS값을 문자에서 별도의 단어로 분리) 및 파일 이름 생성(즉, 와일드카드)을 수행합니다. 변수 값은 쉘 구문을 사용하여 재귀적으로 확장되지 않습니다. 변수 대체에 큰따옴표를 사용하면(그렇게 하지 않을 타당한 이유가 없는 한 사용해야 함) "$col1"값이 직접 확장됩니다 col1.

문자열이 충분히 단조로운 경우(즉, ${token}바꾸려는 문자 외에 셸 특수 문자가 포함되어 있지 않은 경우) $col1셸 조각으로 평가하는 문자열을 기반으로 문자열을 구성할 수 있습니다. 귀하의 예에서는 다음 줄이 인쇄됩니다 ma12345678jid.

eval "echo $col1"

또는 태그를 ${token}원하는 값으로 교체하세요. Bash에서 문자열 교체를 통해 이를 수행할 수 있습니다.

while read -r col1 col2 col3; do
    echo "${col1//'${token}'/$token}"
    echo "${col2}"
    echo "${col3}"
    echo "********************************"
done <input.txt

를 전처리 또는 후처리 단계로 사용할 수도 있습니다 awk(다른 열에서도 교체를 수행할지 여부에 따라 다름).

<input.txt awk -v repl="$token" '{gsub(/\${token}/, repl); print}' |
while read …

를 사용하여 대체를 수행할 수 있지만 sed대체 텍스트에 문자나 개행 문자가 나타나지 않는 것이 확실한 경우에만 가능합니다. 다른 문자가 나타나지 않는다고 확신하는 경우 구분 기호를 다른 것으로 변경할 수 있습니다.&\/$token/$token

<input.txt sed -e "s/\\\${token}/$token/" |
while read …

관련 정보