for 루프를 사용하여 새 행을 찾는 방법은 무엇입니까?

for 루프를 사용하여 새 행을 찾는 방법은 무엇입니까?

웹의 다양한 곳에서 다음을 찾았습니다.

\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 시스템에서는 개행 문자가 를 사용하여 표시되지만 \nWindows에서는 일련의 대체 문자로 표시됩니다 \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.

관련 정보