웹의 다양한 곳에서 다음을 찾았습니다.
\015
\012
\x0a - hex
\n
\r
다양한 줄 바꿈/캐리지 리턴 문자의 동의어로 모두...
하지만 이 작은 스크립트에서는 개행 문자를 만나면 이를 인식할 수 없습니다. 누군가 if 행에서 확인해야 할 사항을 알려줄 수 있나요?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
답변1
for
루프 바로 아래에서 문자열을 사용 하면 각 단어에 대해 작동합니다(여기서는하나단어: 인용문 이후의 모든 것 $test
), 각 문자가 아닙니다. while
루프를 사용하여 read
문자별로 구문 분석하거나 문자열을 반복할 수 있는 숫자 매개변수를 도입해야 합니다.
또한 를 사용할 때 줄바꿈과 공백이 구분 기호로 해석되지 않고 한 번에 한 문자씩 read
강제로 읽혀지는지 확인해야 합니다 .read
작업 버전은 다음과 같습니다.
#!/bin/bash
test="this is a
test"
printf %s "$test" | while IFS= read -r -N 1 a; do
if [[ "$a" == $'\n' ]] ; then
echo "FOUND NEWLINE"
fi
printf %s "$a"
done
둘 다 동일한 개행 코드를 나타내므로 또는 $'\n'
로 바꿀 수 있습니다 . 하지만 이는 or 와는 다릅니다 . 즉,$'\012'
$'\x0a'
\015
\r
입력하다(줄의 시작 부분으로 돌아갑니다). Linux 시스템에서는 개행 문자가 를 사용하여 표시되지만 \n
Windows에서는 일련의 대체 문자로 표시됩니다 \r\n
. 그렇기 때문에 Windows에서 텍스트 파일이 있는 경우 해당 파일을 검색할 수도 있습니다 \r
.
답변2
Bash의 변수에서 개행 문자를 쉽게 확인할 수 있습니다.
[[ $var = *$'\n'* ]]
나는 다음을 사용하는 것이 더 편리하다고 생각합니다.
declare -r EOL=$'\n' TAB=$'\t' # at top of script
..
if [[ $var = *$EOL* ]]; then # to test (no field-splitting in [[ )
답변3
tr
다음을 사용하는 것이 좋습니다 test
.
if [ -n "$(tr -cd '\n\r' < datafile)" ]; then
echo "NEWLINE FOUND"
fi
tr -cd
줄바꿈/캐리지 리턴을 제외한 모든 항목을 제거합니다 . 파일에 개행 문자가 있으면 테스트는 true 출력을 반환합니다 -n
.