末尾の改行なしでgrep出力を作成する

末尾の改行なしでgrep出力を作成する

次のスニペットを検討してください。

X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')

いくつかのパターン条件が任意のテキストファイルの行と一致する場合は、最後の単語を変数に入れたいと思います。

私の問題は、ソースファイルに応じて変数のX末尾にCR、LF、またはCRLFがあります。
私も次のことを試しました。

X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')

したがって、予想されるsed出力は制限されていますが、[A-Za-z]+X変数の内部にはまだ不快なバイトがあります。

最後にどのバイトがあるのか​​を調べるのと同様の複雑な問題をチェックするxxdなど、あまりにも多くのコードを使用せずにどのようにそれを削除できますか?cut

答え1

または、末尾から改行文字を削除しますが、プログラムでこれを行うにはを使用します``$()tr

grep -m1 'some-pattern' some-file | sed -n 's/.* //p' | tr -d '\012\015'

これにより、文字列からキャリッジリターンおよび/または改行が削除されます。

問題はあなたがどのように出力結果。たとえば、デフォルトではecho改行文字が追加されます。echo -nまたはを使用することもできますprintf

答え2

awkこれはフィールドとレコードと連携する可能性があるため、次の問題がないため、お客様のニーズに適したオプションのようです。

x=$(awk '/some-pattern/ { sub(/\r$/, "") ; printf("%s", $NF) ; exit }' some-file)

交換はCRLF行末の問題を防ぐのに役立ちます。

sub(/\r$/, "")末尾のCRがある場合は削除します。レコード(行)区切り文字awkと見なされるため、\n照会中のデータにはないため、削除する必要はありません。

printf("%s", $NF)$NF末尾の改行なしで最後のフィールド()を印刷します(print一部の他のawk関数はデフォルトで改行を追加します)。

exit最初の2つの操作の後に発生します。これはコマンドラインm1にあるのと同じです。grepこれにより、awk最初の2つのコマンドが実行された後にシャットダウンが保証されます。これらのコマンドは一致に対して実行され、awkはFIFO方式でデータを評価するため、最初の一致のみが印刷されます。

答え3

私はこの方法を好む

grep -m1 'some-pattern' some-file | sed -n 's/.* //p' | tr -d '\n'

答え4

grepの一般バージョン(grep -Pを含む)は常に一致する改行文字を出力するため、結果が1つしかない場合(または最後に追加された改行文字を削除したい場合)、最後の文字を削除するだけで十分です。を介してパイプすることでこれを行うことができますhead -c-1

関連情報