Harap pertimbangkan cuplikan ini:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
Saya ingin memasukkan kata terakhir dalam variabel jika beberapa kondisi pola cocok dengan baris dalam file teks sewenang-wenang
Masalah saya adalah bahwa variabel X
memiliki CR atau LF atau CRLF pada akhirnya, tergantung pada file sumber, yang ingin saya singkirkan, karena mengganggu operasi selanjutnya yang ingin saya lakukan.
Saya bahkan mencoba sesuatu seperti:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
dengan demikian mengharapkan sed
output dibatasi [A-Za-z]+
tetapi masih ada byte gangguan ini di dalam variabel X.
Bagaimana saya bisa menyingkirkan itu, tanpa menggunakan terlalu banyak kode seperti lihat apa yang byte yang di akhir dengan xxd
kemudian cut
itu dan serupa komplikasi?
X
CR
, tetapi akan adaLF
. Saya kesulitan memahami apa yang Anda inginkan dari pertanyaan, semoga hasil edit saya melakukan apa yang Anda inginkan.grep/sed
solusiawk
(yang saya tidak mengerti), dan jika tidak saya akan menggunakannya. Terima kasihThe
``
atau$()
akan menghapus baris dari akhir, tetapi untuk melakukan hal ini secara programatik, penggunaantr
.Ini akan menghapus carriage return dan / atau baris baru dari string.
Apa yang mungkin menjadi masalah adalah bagaimana Anda kemudian menampilkan hasilnya. Misalnya, secara default,
echo
menambahkan baris baru. Anda mungkin ingin menggunakanecho -n
atauprintf
.sumber
-m1
akan memastikan bahwa hanya ada satu output line, yang kemungkinan besar, akan memiliki carriage return di akhir.tr
... menarik, berfungsi baik pada file LF dan CRLF. Saya akan berpikir\010\013
untuk beberapa alasan, dan juga\f\r
berfungsi dengan benar. Tentang hasilnya: Saya tidak benar-benar menempatkan output dalam variabel tetapi sebagai variabel terlampir$()
dalam pola untukgrep
pertandingan -some pipe | grep -o " $(...) "
. Terima kasih atas komentarSaya lebih suka cara ini
sumber
Ini bekerja untuk saya:
sumber
Mengapa tidak dibiarkan
sed
saja[\r\f]
:Pendekatan kedua Anda tidak memiliki regex akhir untuk menangkap trailing CR
\r
,.sumber
Versi normal grep (termasuk grep -P) selalu menampilkan umpan baris dengan pasangannya, jadi jika Anda hanya memiliki satu hasil (atau Anda hanya ingin agar umpan baris akhir yang ditambahkan dihapus), cukup dengan menghapus karakter akhir saja dari output, yang dapat Anda lakukan dengan menyalurkannya
head -c-1
.sumber