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 システムでは改行文字が を使用して表示されますが、\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
改行/キャリッジリターンを除くすべての項目を削除します。ファイルに改行文字がある場合、テストは真の出力を返します-n
。