次のスニペットを検討してください。
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
。