2016-08-29 3 views
-1

を無視して、最初と最後に空白を無視して、bashスクリプトの2行を比較する必要が各STRは、内部に複数の行を持っています。 2つの異なるファイルから2つの行が読み込まれ、行末のEOL/EOF/Dotで失敗することがあります。

EOL/EOF/Dot-on-the-end(行末のみ)を削除する必要があります。

ご協力いただければ幸いです。

+0

は、あなたがしたいすべての場合を含むサンプルデータを含め、将来的に検討することを含め、さらに近代的なBSD sedで動作します(ERE構文を有効にする)GNUism sed -rに相当します正しく比較する(そして、オプションで既存のコード)。これはあなたの質問を[MCVE](http://stackoverflow.com/help/mcve)にするのに役立ちます。 (EOLとEOFは非常に異なるものですが、データに文字のASCII EOFマーカーが含まれていれば驚くでしょう - 80年代から90年代のどこでも幅広く使用されていません)。とにかく、問題の再生器を含めて、答えが正しいかどうかの決定的なテストを提供することで、その質問が不明瞭であると思われる場所を排除します。 –

+0

ありがとう:-)試してみる –

答えて

1

限られたセットの方法で異なることが許される2つの文字列を比較する一般的な手法は、それらを正規化して、それらの差異を排除する変換を実行することです。例えば、大文字小文字のために正規化したい場合、簡単に変換するには、両辺をすべて大文字または全小文字に変更します。先行する空白のために正規化するには、単純にそれを除去することができます。


normalize() { 
    s=${1//$'\r\n'/$'\n'} # change CRLFs to LFs 
    s=${1%$'\n'}   # eliminate any trailing LF 

    # run other transforms (removing leading whitespace, trailing dots) line-by-line 
    sed -E \ 
     -e 's/^[[:space:]]+//' \ 
     -e 's/[.]$//' \ 
     <<<"$s" 
} 

# compare normalized strings  
if [[ "$(normalize "$STR1")" = "$(normalize "$STR2")" ]]; then 
    echo "Strings are identical after normalization" 
else 
    echo "Strings differ after normalization" 
fi 

  • $''はバックスラッシュエスケープはリテラルを発現するために使用されることを可能にします。したがって、$'\r\n'はリテラルCRLFです。
  • ${var//foo/bar}は、すべてfooのすべてのインスタンスがbarに置き換えられています。$varが展開されます。
  • [[ ]]を使用すると、ほとんどの引用符が不要になりますが、右側の引用符で比較すると、glob式ではなくリテラル文字列として扱われます。
  • sed -EはのMacOS X上
関連する問題