Desenleri tek bir satırda nasıl “birleştirebilirim”?


10

Grep ve sed yapıyorum ve ilgilendiğim bir dosyanın 2 satırını alıyorum. Bu satırları yeni satır karakteri ile biten tek bir satırda nasıl alabilirim?
Şimdi alıyorum:

pattern1  
pattern2  

almak isterim pattern1 pattern2 \n


1
Daha fazla örnek veri paylaşabilir misiniz?
slm

Kullanım printf %s\\n pattern1 pattern2 | sed '$!N;s/\n/ /'
Valentin Bajrami

Birden çok çıktı satırını bir birleştirmek istiyorsanız, Yapıştır iş için bir araçtır.
slm

herhangi bir araç var mı? Bunu nasıl yapmayı planlıyorsun?
Braiam

Yanıtlar:


7

paste:

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

Şöyle diyor: "stdin'den (ilk -) bir satır okuyun, stdin'den (ikinci -) başka bir satır okuyun , sonra bir boşlukla onlara katılın"


bash'a özgü bir teknik:

$ 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


Nedir - -? Komut böyle mi?
Jim

@Jim - evet bu doğru. Bunlar pastegirdiyi nasıl işlemesini istediğinizi anlatıyor . Her seferinde 2 tane. Aynı anda 3 yapmak için daha fazlasını ekleyin. seq 10 | paste -d " " - - .
slm

6

Arka arkaya üç farklı yöntem koyacağım

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

Ve daha fazlası var.


trEğer eklemek isteyebilirsiniz böylece çözüm biten yeni satır yutacak ; echoo birine
Glenn Jackman

@glennjackman ah doğru! İpucu için teşekkürler. Yine de cevabı değiştirmekte özgürsünüz. Biraz özledim!
Valentin Bajrami

2

kabuk komut dosyasını kullanarak veya komut satırında yapabilirsiniz, komutun çıktısını bir değişkene koymanız yeterlidir echo:

# x=$(grep -e "pattern1\|pattern2" test)
# printf '%s\n' "$x"
pattern1 pattern2

belirtilmemişse, değişken de dosya adı genişletmesine tabidir, bu nedenle sonuçta glob karakterleriniz ( *veya gibi ?) varsa, değerler değişebilir.
glenn jackman

@glennjackman, bundan bahsettiğiniz için teşekkürler, bunu nasıl düzeltebiliriz?
Nidal

@Networker backticks kullanarak değil, $()bunun yerine .. ve printf kullanarakprintf '%s\n' "$x"
Valentin Bajrami

Ben printf '%s\n' "$x""iç" satırsonu kaldırmak olmaz beklenir .
glenn jackman

2

İle sedşunları yapabilirsiniz:

<your previous commands> | sed '{N; s/\n/ /}'
  • N;bir sedsonraki satırı desen alanına eklemeyi söyler , bu yüzden şimdi sedher iki satırla da çalışıyor.
  • s/\n/ / yeni satır karakterini bir boşlukla değiştirir, iki satırı "birleştirir".

2

Basit bir yol, boru çıkışı xargs:

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

Bu yalnızca küçük çıkışlarla çalışır, çünkü komut satırı başına maksimum karakterle sınırlıdır. En büyük değer sisteme bağlıdır, bu değeri kullanarak alabilirsiniz getconf ARG_MAX.


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

IFS isterseniz yemekten mutluluk duyacaktır.


-1

sed / grep'i backticks'e sar

orijinal komutunuz:

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

yeni komutunuz:

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

Çizgiler arasındaki boşlukları almaz, ancak her zaman başka bir sed borusuna yapışabilirsiniz:

 | sed 's/$/ /'

1
Oh hayır. Bu sed komutunun çıktısını yürütür .
glenn jackman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.