forループを使用して新しい行を見つける方法は?

forループを使用して新しい行を見つける方法は?

Webのさまざまな場所で次のものを見つけました。

\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文字ごとに解析するか、文字列を繰り返すことができる数値パラメータを導入する必要があります。

また、使用するときは、改行とスペースが区切り文字として解釈されず、一度に1文字ずつ強制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改行/キャリッジリターンを除くすべての項目を削除します。ファイルに改行文字がある場合、テストは真の出力を返します-n

関連情報