लंबी रेखा अभिव्यक्ति को कई लाइनों में कैसे विभाजित करें?


15
sed 's/[long1][long2]/[long3][long4]/' file.txt

मैं इस कमांड को कई लाइनों में विभाजित करना चाहूंगा - fx कुछ इस तरह:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

\तार का उपयोग करना या अलग करना काम नहीं करता था।



यही कारण है कि पर्ल /xप्रतिस्थापन करने के लिए संशोधक है।
कोरबा

1
@ नेटवर्कर: हां, धन्यवाद, मैंने अपना जवाब वहां भी जोड़ दिया
रफेल

जवाबों:


8

आप चर को काटने के लिए लंबी स्ट्रिंग बचा सकते हैं, फिर sedकमांड में उपयोग कर सकते हैं :

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

यदि आप उपयोग कर सकते हैं perl, तो आप xसंशोधक के साथ लंबे पैटर्न को तोड़ सकते हैं :

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file

1
आप इतने सारे उद्धरणों का उपयोग क्यों करते हैं? sed "s/$string/$replace/" file.txtठीक है।
स्कॉट

1
इसके अलावा, ज़ाहिर है, आपको बाद में स्थान को हटाने की आवश्यकता है replace=
स्कॉट

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

यदि नई लाइनों को इंडेंट नहीं किया जाता है तो बैकस्लैश के साथ कई लाइनों पर विभाजन काम करता है।

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

GNU sed 4.2.2 के साथ Cygwin पर परीक्षण किया गया


आपका sed संस्करण क्या है? मैं साथ परीक्षण GNU sed version 4.2.1करता हूं और यह काम नहीं करता है।
कोउंगलम

2
ऐसा लगता है कि पहली पंक्ति के अंत में एक बैकस्लैश गायब है, स्लैश को रोकें?
वोल्कर सीगल

7

एक और पहलू:

[long]उपरोक्त आइटम कितने रखरखाव योग्य हैं ?

छोटे और अधिक विशिष्ट आप खंडों को रख सकते हैं, समय बीतने के साथ-साथ उन्हें बदलना और बढ़ाना आसान होगा और उनके द्वारा प्रदान किए जाने वाले फ़ंक्शन के आसपास (सेड-एक्सटर्नल) तथ्य बदल जाते हैं।

जैसे

सेड
-ए'एस / [न्यूनतम-एस 1] / [न्यूनतम-आर 1] / '\ _
-ए'एस / [न्यूनतम-एस २] / [न्यूनतम-आर २] / ’
-ए'एस / [न्यूनतम-एस ३] / [न्यूनतम-आर ३] / / \
-ए'एस / [न्यूनतम-एस ४] / [न्यूनतम-आर ४] / ' 

... के लिए प्रयास करने और पसंद करने के लिए कुछ हो सकता है।


4

आप इसे इस तरह भी तोड़ सकते हैं:

sed '/[long1][long2]/
    s//[long3][long4]/'

या शायद पसंद करें:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

या एक वंशानुगत के साथ:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.