2016-09-22 13 views
2

csvファイルでパターンと一致しない行をチェックし、間違った行でメールを送信するシェルスクリプト(bash)があります。それはうまく動作しますが、間違った行を組み合わせている間、Linuxは改行として\ rを付けますが、電子メールに改行はありません。ですから、改行として\ r \ nを送信しようとしますが、これは効果がありません。この\ n改行は、perlやbashで削除してください。ここで shellscriptから電子メールの改行を取得するには?

は、一例として、最小限の作業スクリプトです:

SUBJECT="Error while parse CSV" 
TO="[email protected]" 
wrongLines=$(perl -ne 'print "Row $.: $_\r\n" if not /^00[1-9]\d{4,}$/' $file) 
MESSAGE="Error while parse following Lines, pattern dont match: \r\n $wrongLines" 
echo $MESSAGE |od -c 

ODの出力は次のようになります。

0000000 E r r o r  w h i l e  p a r s 
0000020 e  f o l l o w i n g  L i n e 
0000040 s ,  p a t t e r n  d o n t 
0000060 m a t c h :  \ r \ n  R o w 
0000100 2 :  4 9 2 7 8 3 8 7 4 3  \r R 
0000120 o w  3 :  4 8 2 3 2 8 9 7 3 8 
0000140  \r \n 
0000143 

しかし、OD出力の行との間に\ nがあるという理由は何ですか削除?私は\ r \ nの代わりに\ x0D \ x0Aも試してみますが、これも役に立たない。助言がありますか?

+2

さらに引用符を使用してください: 'echo" $ MESSAGE "'。そしてあなたは '\ r'を望んでいない。 –

+0

[echo 'マニュアルページ](http://man7.org/linux/man-pages/man1/echo.1.html)を読むべきでしょうか?代わりに['printf'](http://man7.org/linux/man-pages/man1/printf.1.html)を使用してください。 –

+0

@gniourf_gniourfシーケンス '\ r \ n'は多くのテキストベースのプロトコルの標準改行文字です。 –

答えて

2

あなたの問題は、引用符を使用していないことです!

ルック:引用符なし

$ a="A multi-line 
input 
variable" 
$ echo $a 
A multi-line input variable 
$ echo "$a" 
A multi-line 
input 
variable 
$ 

、あなたはword splittingfilename expansionの被害者になるだろう(上記の例で示されていません)。

はまた、\r又は\nを追加する(つまり、逐語的であるR又はN続いバックスラッシュ)は全然支援するつもりはありません。

結論:すべての変数の拡張を引用してください!常に! (が本当にである場合は、グロブパターンを意味します。その場合は、意図的に拡張を引用しなかった理由を説明するコードにコメントを追加します)。

サイドノート:don't use upper case variable names

小文字の名前を使用して、Bashの内部変数と環境変数で使用される大文字の変数名と混同しないようにすることをお勧めします。

+0

奇妙なことは、テキストの後ろに改行があって、concatの前に出力に改行が入っていて、echoコマンドで引用符がないことです。 – kockiren

関連する問題