एक सीमांकक पर लंबी लाइन विभाजित


21

इस तरह से इनपुट को विभाजित करने के लिए मैं किस कमांड का उपयोग कर सकता हूं:

foo:bar:baz:quux

इस मामले में?

foo
bar
baz
quux

मैं cutकमांड का पता लगाने की कोशिश कर रहा हूं, लेकिन यह केवल निश्चित मात्रा में इनपुट के साथ काम करता है, जैसे "पहले 1000 वर्ण" या "पहले 7 क्षेत्र"। मुझे मनमाने ढंग से लंबे इनपुट के साथ काम करने की आवश्यकता है।


5
आपका मतलब है tr : '\n' < input?
jw013

आप किस खोल का उपयोग कर रहे हैं? दे घुमा के?
ग्लेन जैकमैन

जवाबों:


34

कुछ विकल्प हैं:

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

आप इसे शुद्ध रूप में भी कर सकते हैं bash:

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

3
ध्यान दें कि \nप्रतिस्थापन स्ट्रिंग में इस तरह का उपयोग करना GNU sed में काम करेगा, लेकिन अधिकांश अन्य sed कार्यान्वयन में विफल रहेगा।
wjv

@chrisdown AIX में काम करने के लिए पहले दो पाने का एक तरीका है?
cokedude


4

यदि आपका grep समर्थन करता है -oतो आप इसे इस तरह कर सकते हैं:

grep -o '[^:]\+'

या awk के साथ, रिकॉर्ड विभाजक को :निम्न पर सेट करना :

awk -v RS=: 1

या ग्नू कट के साथ:

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

संपादित करें

जैसा कि क्रिस द्वारा नीचे उल्लेख किया गया है, यह एक अनुगामी न्यूलाइन को छोड़ देगा, इससे बचा जा सकता है यदि आपका awk RSएक नियमित अभिव्यक्ति (GNU awk के साथ परीक्षण) के रूप में निर्दिष्ट करने का समर्थन करता है :

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

आपका awkउदाहरण एक (शायद अवांछनीय) न्यूलाइन को पीछे छोड़ देगा।
क्रिस डाउन

@ क्रिसडाउन: आप सही कह रहे हैं, इससे बचा जा सकता है अगर आरएस एक नियमित अभिव्यक्ति हो सकती है।
थोर

-1

कुछ तार में मुझे ऊपर के समाधान के साथ समस्या थी। लेकिन यह मेरे लिए काम किया:

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

जैसा कि लिखा गया है, यह ओपी उदाहरण इनपुट को रूपांतरित नहीं करता है।
kulgrien
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.