
私はデータファイルセットの内容をテストして、印刷可能文字と印刷されない文字からなるセットから1つ以上の文字が含まれていることを確認します。
最後の質問は、ファイルに改行文字が含まれているかどうかを検出することです。私のものGNU grep 3.0各入力にLFを含めるように宣言してください。なぜですか?
echo -n "test" | grep -UF -e $'\x0a'
どんなアイデアがありますか?暗黙的なEOL/EOF干渉があるようです。
答え1
grepは行指向です。入力が改行で終わらない場合は、最後の改行(またはファイルの先頭)の後のテキストを行として扱います。
ライン指向プログラムは、バイナリファイルを直接操作するのには適していません。バイナリファイルに特に長い「ライン」があると、病理学的状態が発生することがよくあります。
代わりに、tr
次の組み合わせを検討してくださいcmp
。
$ echo -n foo | tr -d -c $'\n' | cmp /dev/null -
# no output and exits with status 0
$ echo foo | tr -d -c $'\n' | cmp /dev/null -
cmp: EOF on /dev/null which is empty
# exits with status 1
この方法は、最初の改行文字まで入力(バッファリングを含む)だけを読み取ることができるという利点もあります。
答え2
~からPOSIX仕様grep
:
正規表現の一致はテキスト行に基づいている必要があります。はパターン[...]を分離または終了するため、正規表現には
<newline>
を含めることはできません<newline>
。同様に、パターンは入力の個々の行(終了文字を除く)と一致するため、<newline>
パターンは<newline>
入力に見つかったものと一致することはできません。
入力に改行文字(Unixと同じ)が含まれていることを確認するには、次のように行数を計算できますwc -l
。
lines=$( wc -l <inputfile )
if [ "$lines" -gt 0 ]; then
echo 'Input had a linefeed character in it'
fi
または文字列がある場合:
lines=$( printf '%s' "$string" | wc -l )
# etc.