रिक्त स्थान में newlines कन्वर्ट करने के लिए sed का उपयोग करना


22

कहो कि मेरे पास एक शेल वैरिएबल है $stringजो कुछ टेक्स्ट को कई न्यूलाइन्स के साथ रखता है, जैसे:

string="this
is 
a test"

मैं इस स्ट्रिंग को एक नए स्ट्रिंग में परिवर्तित करना चाहूंगा new_stringजहां सभी लाइन ब्रेक रिक्त स्थान में परिवर्तित हो जाएं:

new_string="this is a test"

मैंने कोशिश की:

print $string | sed 's/\n/ /g'

लेकिन यह काम नहीं किया

मैं भी सोच रहा था कि क्या ऐसा करने का कोई तरीका है perl -0777 's/\n/ /g'या शायद कमांड tr?


जवाबों:


32

यदि आप केवल स्ट्रिंग में नई लाइनें निकालना चाहते हैं, तो आपको उपयोग करने की आवश्यकता नहीं है sed। आप बस इस्तेमाल कर सकते हैं

$  echo "$string" | tr '\n' ' '

जैसा कि दूसरों ने बताया था।

लेकिन यदि आप किसी फ़ाइल का उपयोग करके नई लाइनों को रिक्त स्थान में बदलना चाहते हैं sed, तो आप इसका उपयोग कर सकते हैं:

$ sed -i ':a;N;$!ba;s/\n/\t/g' file_with_line_breaks

या यहां तक ​​कि awk:

$ awk '$1=$1' ORS=' ' file_with_line_breaks > new_file_with_spaces

1
spongeएक इनपुट फ़ाइल को अधिलेखित करने के लिए एक उपयोगी उपयोगिता है। यह पैकेज का हिस्सा है moreutils... जैसे। awk '$1=$1' ORS=' ' file |sponge file
पीटर।

@ संदर्भ जानकारी के लिए धन्यवाद। स्थापित कर रहा है moreutils...
pferor


4

फिर भी एक अन्य विकल्प का उपयोग किया जाएगा xargs(जो, इसके अलावा, कई सफेद स्थान को निचोड़ता है):

string="this
    is 
a    test"

printf "$string" | xargs   # this is a test

3

इको सफेद स्थान की उपेक्षा करता है, इसलिए इसे काम करना चाहिए:

new_string=`echo $string`

हाँ, यह काम करेगा, लेकिन शायद बहुत अच्छी तरह से। यह एक स्थान पर मल्टी व्हाट्सएप को ध्वस्त कर देगा। जिसमें TAB को रिक्त स्थान में परिवर्तित करना शामिल है।
पीटर।

3

यदि आपके पास पहले से ही एक बैश वैरिएबल के रूप में स्ट्रिंग है, जैसा कि आपका उदाहरण दिखाता है, यह बेकार है और संसाधनों का बेकार है (और अधिक टाइपिंग) कॉल करने के लिए sed, awkऔर printf, आदि ... आप बस बैश चर विस्तार का उपयोग कर सकते हैं :

string="${string//$'\n'/ }"

आपको इसे पुनः असाइन करने की भी आवश्यकता नहीं है। आप विस्तार का उपयोग कर सकते हैं, और $stringअपरिवर्तित छोड़ सकते हैं।

printf "${string//$'\n'/ }" >file

3

आप इस awk कमांड को भी आजमा सकते हैं,

awk -v RS="" '{gsub (/\n/," ")}1' file

उदाहरण:

$ (echo This; echo is; echo a; echo test.) | awk -v RS="" '{gsub (/\n/," ")}1'
This is a test.

1
state=$(set +o)
set -f ; IFS='
'; set -- $string
unset IFS; string="$*"
eval "$state"

यह \nशेल चर $stringमें होने वाले एक या अधिक इलाइन वर्णों के किसी भी अनुक्रम को एकल में रूपांतरित करता है <space>


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