programing

새 줄로 내용을 unix 변수에 파일로 저장

skycolor 2023. 4. 27. 22:07
반응형

새 줄로 내용을 unix 변수에 파일로 저장

저는 텍스트 파일 테스트가 있습니다.다음 내용을 포함하는 txt:

text1
text2 

그리고 UNIX 변수에 파일의 내용을 할당하고 싶지만, 이렇게 하면 다음과 같습니다.

testvar=$(cat test.txt)
echo $testvar

결과:

text1 text2

대신에

text1
text2 

누가 저에게 이것에 대한 해결책을 제안해 줄 수 있나요?

할당은 새 줄 문자를 제거하지 않습니다. 실제로는echo이렇게 하는 것.새 줄을 유지하려면 문자열 주위에 따옴표를 붙이기만 하면 됩니다.

echo "$testvar"

이것은 당신이 원하는 결과를 줄 것입니다.데모는 다음 스크립트를 참조하십시오.

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

새 줄이 공백으로 대체되는 이유는 완전히 다음과 관련이 없습니다.echo명령, 오히려 그것은 사물의 조합입니다.

명령행이 주어지면,bash문서에 따라 그것을 단어로 나눕니다.IFS변수:

IFS: 확장 후 단어 분할에 사용되는 내부 필드 구분 기호...기본값은 입니다.<space><tab><newline>.

기본적으로 이러한 세 문자 중 하나를 사용하여 명령을 개별 단어로 분할할 수 있습니다.그 후 구분자라는 단어는 사라지고, 남은 것은 단어 목록뿐입니다.

그것과 그것을 결합하세요.echo문서화(a)bashinternal 명령)을 사용하면 공백이 출력되는 이유를 알 수 있습니다.

echo [-neE] [arg...]: 공백으로 구분된 인수를 출력한 다음 새 줄을 입력합니다.

사용할 때echo "$x"그것은 전체를 강제합니다.x다음에 따라 단일 단어가 될 변수bash따라서 갈라지지 않습니다.다음을 통해 확인할 수 있습니다.

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

자, 그.count함수는 단순히 주어진 인수의 수를 출력합니다.1 2 3그리고.a b c d변형은 그것을 행동으로 보여줍니다.

그런 다음 두 가지 변형을 사용하여 테스트합니다.x변수.인용문이 없는 은 네 개의 단어가 있다는 것을 보여줍니다."test","1","test"그리고."2"따옴표를 추가하면 단일 단어가 됩니다."test 1\ntest 2".

이는 새 줄이 포함된 IFS(Internal Field Separator) 변수 때문입니다.

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

해결 방법은 일시적으로 새 줄을 포함하지 않도록 IFS를 재설정하는 것입니다.

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

IFS에 대해 이 끔찍한 변경을 되돌리려면:

IFS=$IFSBAK

Bash-ge 4에는 표준 입력에서 배열 변수로 줄을 읽기 위한 맵 파일이 내장되어 있습니다.

help mapfile 

mapfile < file.txt lines
printf "%s" "${lines[@]}"

mapfile -t < file.txt lines    # strip trailing newlines
printf "%s\n" "${lines[@]}" 

참고 항목:

http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile

변수가 올바르게 설정되었습니다.testvar=$(cat test.txt)새 줄 문자로 구성된 이 변수를 표시하려면 예를 들어 큰따옴표를 추가하면 됩니다.

echo "$testvar" 

다음은 전체 예입니다.

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

다른 옵션에 관심이 있는 경우:

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

envdir유틸리티는 이를 위한 쉬운 방법을 제공합니다. envdir에서는 파일을 사용하여 환경 변수를 나타내며, 파일 이름은 환경 이름에 매핑되고 파일 내용은 환경 값에 매핑됩니다.파일 내용에 새 줄이 포함되어 있으면 환경도 마찬가지입니다.

https://pypi.python.org/pypi/envdir 을 참조하십시오.

언급URL : https://stackoverflow.com/questions/2789319/file-content-into-unix-variable-with-newlines

반응형