-1
を無視して、最初と最後に空白を無視して、bashスクリプトの2行を比較する必要が各STRは、内部に複数の行を持っています。 2つの異なるファイルから2つの行が読み込まれ、行末のEOL/EOF/Dotで失敗することがあります。
EOL/EOF/Dot-on-the-end(行末のみ)を削除する必要があります。
ご協力いただければ幸いです。
を無視して、最初と最後に空白を無視して、bashスクリプトの2行を比較する必要が各STRは、内部に複数の行を持っています。 2つの異なるファイルから2つの行が読み込まれ、行末のEOL/EOF/Dotで失敗することがあります。
EOL/EOF/Dot-on-the-end(行末のみ)を削除する必要があります。
ご協力いただければ幸いです。
限られたセットの方法で異なることが許される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上
は、あなたがしたいすべての場合を含むサンプルデータを含め、将来的に検討することを含め、さらに近代的なBSD
sed
で動作します(ERE構文を有効にする)GNUismsed -r
に相当します正しく比較する(そして、オプションで既存のコード)。これはあなたの質問を[MCVE](http://stackoverflow.com/help/mcve)にするのに役立ちます。 (EOLとEOFは非常に異なるものですが、データに文字のASCII EOFマーカーが含まれていれば驚くでしょう - 80年代から90年代のどこでも幅広く使用されていません)。とにかく、問題の再生器を含めて、答えが正しいかどうかの決定的なテストを提供することで、その質問が不明瞭であると思われる場所を排除します。 –ありがとう:-)試してみる –