새 줄로 내용을 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)bash
internal 명령)을 사용하면 공백이 출력되는 이유를 알 수 있습니다.
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
'programing' 카테고리의 다른 글
ng serve 명령을 실행할 때 "포트 4200이 이미 사용 중" (0) | 2023.04.27 |
---|---|
스위프트에서 완료 핸들러로 함수를 만들려면 어떻게 해야 합니까? (0) | 2023.04.27 |
이클립스에서 키보드만 사용하여 오류로 이동하는 방법은 무엇입니까? (0) | 2023.04.27 |
iOS 7.0에서 잘못된 컨텍스트 0x0 및 시스템 성능 저하 (0) | 2023.04.27 |
"[이름 공간] 유형을 로드할 수 없습니다.글로벌"이 나를 슬프게 합니다. (0) | 2023.04.27 |