Bagaimana saya bisa "menggabungkan" pola dalam satu baris?

10

Saya melakukan grep dan sed dan saya mendapatkan 2 baris file yang saya minati. Bagaimana saya bisa mendapatkan baris-baris ini dalam satu baris yang berakhir dengan karakter baris baru?
Sekarang saya mendapatkan:

pattern1  
pattern2  

Saya ingin mendapatkan pattern1 pattern2 \n

Jim
sumber
1
Bisakah Anda membagikan lebih banyak data sampel?
slm
Gunakan printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Valentin Bajrami
Tempel adalah alat untuk pekerjaan itu, jika Anda bermaksud untuk menggabungkan beberapa baris output menjadi satu.
slm
ada alat khusus? Bagaimana Anda berencana untuk melakukan ini?
Braiam

Jawaban:

7

paste:

{...pipeline...} | paste -d " " - -

Yang mengatakan: "baca baris dari stdin (yang pertama -), baca baris lain dari stdin (yang kedua -), lalu gabung dengan mereka dengan spasi"


teknik khusus bash:

$ x=$(grep -o pattern. test.txt)
$ echo "$x"
pattern1
pattern2
$ mapfile -t <<< "$x"
$ echo "${MAPFILE[*]}"
pattern1 pattern2

ref: http://www.gnu.org/software/bash/manual/bashref.html#index-mapfile

glenn jackman
sumber
Apa - -? Apakah perintahnya seperti itu?
Jim
@ Jim - ya itu benar. Itu memberitahu pasteAnda bagaimana Anda ingin memproses input. 2 sekaligus. Tambahkan lebih banyak untuk dilakukan 3 sekaligus. seq 10 | paste -d " " - - .
slm
6

Saya akan meletakkan tiga versi metode yang berbeda berturut-turut

AWK

printf %s\\n pattern1 pattern2 | awk -vRS="\n" -vORS=" " '1; END {print RS}'

SED

printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'

TR

printf %s\\n pattern1 pattern2 | tr '\n' ' '; echo

Dan masih banyak lagi.

Valentin Bajrami
sumber
The trsolusi akan menelan baris baru berakhir, sehingga Anda mungkin ingin menambahkan ; echoke salah satu yang
glenn Jackman
@glennjackman ah benar! Terima kasih atas petunjuknya. Anda bebas untuk mengubah jawabannya. Saya melewatkan sedikit itu!
Valentin Bajrami
2

Anda bisa melakukannya menggunakan skrip shell atau di command-line, cukup masukkan output dari perintah dalam variabel lalu echo:

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2
Nidal
sumber
tanda kutip, variabel juga tunduk pada ekspansi nama file, jadi jika Anda memiliki karakter gumpal (suka *atau ?) dalam hasilnya, nilainya dapat berubah.
glenn jackman
@glennjackman, terima kasih telah menyebutkan ini, bagaimana kita bisa memperbaikinya?
Nidal
@Networker dengan tidak menggunakan backticks melainkan $().. dan menggunakan printfprintf '%s\n' "$x"
Valentin Bajrami
Saya berharap bahwa printf '%s\n' "$x"TIDAK akan menghapus baris "internal".
glenn jackman
2

Dengan sed, Anda dapat melakukan ini:

<your previous commands> | sed '{N; s/\n/ /}'
  • N;memberitahu seduntuk menambahkan baris berikutnya ke dalam ruang pola, jadi sekarang sedbekerja dengan kedua baris.
  • s/\n/ / mengganti karakter baris baru dengan spasi, "menggabungkan" dua baris bersama.
Alaa Ali
sumber
2

Cara sederhana, output pipa ke xargs:

$ echo -e 'a\nb' | xargs
a b

Ini hanya berfungsi dengan ouput kecil, karena dibatasi oleh karakter maksimum per baris perintah. Nilai terbesar tergantung pada sistem, Anda bisa mendapatkan nilai ini menggunakan getconf ARG_MAX.

cuonglm
sumber
1
( set -f; IFS='
'; printf '%s %s\n' $(grepcmd <input)
) >output

IFS akan dengan senang hati memakannya jika Anda mau.

mikeserv
sumber
-1

bungkus sed / grep Anda di backticks

ketika perintah awal Anda adalah:

grep -i 'foo' mylog.log | sed 's/bar/baz/gi'

perintah baru Anda adalah:

`grep -i 'foo' mylog.log | sed 's/bar/baz/gi'`

Tidak mendapatkan spasi di antara garis, tetapi Anda selalu dapat menempel pada pipa sed lain:

 | sed 's/$/ /'
TheRuss
sumber
1
Eh, tidak. Itu akan mengeksekusi output dari perintah sed.
glenn jackman