sınırlayıcıda uzun çizgi bölme


21

Bu şekilde girişi bölmek için hangi komutu kullanabilirim:

foo:bar:baz:quux

bunun içine?

foo
bar
baz
quux

cutKomutu anlamaya çalışıyorum, ancak "ilk 1000 karakter" veya "ilk 7 alan" gibi yalnızca belirli miktarda girişle çalışıyor gibi görünüyor. İsteğe bağlı olarak uzun girdilerle çalışmam gerekiyor.


5
Gibi tr : '\n' < inputmi demek istiyorsun?
jw013

Hangi kabuğu kullanıyorsunuz? bash?
Glen Jackman

Yanıtlar:


34

Birkaç seçenek var:

  • tr : \\n
  • sed 's/:/\n/g'
  • awk '{ gsub(":", "\n") } 1'

Bunu ayrıca saf olarak da yapabilirsiniz bash:

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done

3
Bunun \nyerine değiştirme dizesinde GNU sed'de çalışacağını, ancak diğer sed uygulamalarında da başarısız olacağını unutmayın.
wjv

@chrisdown İlk ikiye AIX'te çalışmanın bir yolu var mı?
cokedude

4
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux

4

Grep'iniz destekliyorsa, -obunu yapabilirsiniz:

grep -o '[^:]\+'

Veya awk ile, kayıt ayırıcıyı aşağıdaki gibi ayarlamak ::

awk -v RS=: 1

Veya GNU kesimi ile:

cut -d: --output-delimiter=$'\n' -f1-

Düzenle

Aşağıda Chris'in belirttiği gibi, bu takip eden bir yeni satır bırakacaktır, eğer awk RSnormal bir ifade olarak belirtmeyi destekliyorsa bu önlenebilir (GNU awk ile test edilmiştir):

awk -v RS='[:\n]' 1

Sizin awkörnek (muhtemelen istenmeyen) sondaki yeni satır bırakacaktır.
Chris Down,

@ChrisDown: Haklısın, RS düzenli bir ifade olabilirse bu önlenebilir.
Thor

-1

Bazı karakterlerde yukarıdaki çözümlerle ilgili problemim vardı. Ama bu benim için çalıştı:

echo $string | sed 's/\\n/ /g' | tr " " \\n

Yazıldığı gibi, bu OP örnek girişini dönüştürmez.
kbulgrien
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.