के साथ स्पेस को प्रतिस्थापित करता है मैं एक टैब के साथ प्रत्येक पंक्ति की शुरुआत से प्रत्येक दो रिक्त स्थान को प्रतिस्थापित करना चाहता हूं। मैं निम्नलिखित की कोशिश की:perl टैब
s/^(\s{2})+/\t/gm;
यह काम did not।
के साथ स्पेस को प्रतिस्थापित करता है मैं एक टैब के साथ प्रत्येक पंक्ति की शुरुआत से प्रत्येक दो रिक्त स्थान को प्रतिस्थापित करना चाहता हूं। मैं निम्नलिखित की कोशिश की:perl टैब
s/^(\s{2})+/\t/gm;
यह काम did not।
लगता है कि आप लाइन द्वारा फ़ाइल लाइन पढ़ रहे हैं:
$line =~ s/\G[ ]{2}/\t/g;
आप तो मैंने पूरी फाइल को फिसल दिया है:
$file =~ s/(?:\G|^)[ ]{2}/\t/mg;
वैकल्पिक समाधान के रूप में, /m
संशोधक के बिना आप सकारात्मक दिखने का उपयोग कर सकते हैं। इस तरह के दृष्टिकोण मामलों में जहां आप कुछ और जांच करने के लिए, बस लाइन की शुरुआत नहीं की जरूरत है के लिए उपयोगी हो सकता है, इसलिए जब \m
संशोधक मदद नहीं होता >>
$_ = " 123\n 456\n 789";
s/(?:(?<=^)|(?<=\n))\s{2}/\t/g;
print $_;
ऊपर के उदाहरण कोड में प्रत्येक /g
डबल खाली स्थान के \s{2}
पीछे है स्ट्रिंग की शुरुआत (?<=^)
या (?: .. | ..)
नई लाइन वर्ण (?<=\n)
टैब \t
द्वारा प्रतिस्थापित किया गया है।
कैसे this के बारे में?
my $test_string = " some test stuff\ndivided to\n provide the challenge";
$test_string =~ s/^[ ]{2}/\t/gm;
print $test_string;
स्पष्टीकरण: \s
वास्तव में एक एकल प्रतीक उर्फ नहीं है, लेकिन एक चरित्र 'खाली स्थान के' वर्ग: यह \n\
और उदाहरण के लिए \t
दोनों शामिल हैं। यदि आप केवल रिक्त स्थान को प्रतिस्थापित करना चाहते हैं, तो अपने regexes में रिक्त स्थान का उपयोग करें; मेरे लिए एक चरित्र वर्ग (बस /^ {2}/...
के बजाय सेटिंग आप की जरूरत नहीं है अधिक पठनीय है (और इसके अलावा) /x
modifier साथ तोड़ नहीं होंगे।
, अगर आप सिर्फ दो अंतरिक्ष प्रतीकों बदलना चाहते हैं, +
परिमाणक का उपयोग
अद्यतन:। यदि आप प्रत्येक दो रिक्त स्थान को बदलने के लिए की जरूरत है, मुझे लगता है मैं बजाय इस का उपयोग करेंगे:
$test_string =~ s#^((?:[ ]{2})+)#"\t" x (length($1)/2)#gme;
... या Ikegami के जवाब के रूप में बस \ जी लंगर ।
का उपयोग करें चार प्रमुख रिक्त स्थान के लिए काम नहीं करता है। विस्तृत स्पष्टीकरण के लिए – ikegami
याद रखें कि +
परिमाणक का अर्थ है "एक या अधिक," और इसका मतलब है जो \s{2}
पर लागू की गई "ठीक दो खाली स्थान के पात्रों।" एक साधारण उदाहरण के लिए, एक प्रोग्राम है जो करने के लिए शून्य से दस रिक्त स्थान और प्रयास के तार बनाता है पर विचार एक समान पैटर्न के खिलाफ उन्हें मैच।
#! /usr/bin/env perl
use strict;
use warnings;
for (0 .. 10) {
$_ = " " x $_;
printf "%-13s %s\n", "[$_]:", /^(\s{2})+$/ ? "match!" : "no match.";
}
आउटपुट:
[]: no match. [ ]: no match. [ ]: match! [ ]: no match. [ ]: match! [ ]: no match. [ ]: match! [ ]: no match. [ ]: match! [ ]: no match. [ ]: match!
लिखा के रूप में, अपने पैटर्न किसी भी सकारात्मक भी तार्किक शुरुआत के- लाइन पर खाली स्थान के वर्णों की संख्या के लिए एक एकल टैब चरित्र विकल्प।
आप अपने कोड का व्यापक संदर्भ प्रदान नहीं करते हैं। /m
और /g
स्विच के उपयोग से, मुझे लगता है कि आपके पास टेक्स्ट का कुछ हिस्सा है, शायद फ़ाइल की पूरी सामग्री, जिसे आप पूरी तरह से संचालित करना चाहते हैं। नीचे दिया गया कार्यक्रम इस अनुमानित स्थिति को यहां-दस्तावेज़ का उपयोग करके अनुकरण करता है और प्रत्येक टैब के पहले दो रिक्त स्थान को केवल टैब के साथ बदल देता है।
#! /usr/bin/env perl
use strict;
use warnings;
$_ = <<EOText;
Three
Two
Four
Five
Zero
One
EOText
s/^ /\t/mg;
# for display purposes only
s/\t/\\t/g;
print;
आउटपुट:
\t Three \tTwo \t Four \t Five Zero One
नोट अतिरिक्त टिप्पणी की है कि s///
अपने कोड में रहने नहीं होता। अंतरिक्ष और टैब अक्षरों के बीच अंतर जोड़ने के लिए यह है।
यदि यह आपके कार्यक्रम का एकमात्र उद्देश्य है, तो यह एक आसान लाइनर बन जाता है। संशोधित सामग्री के साथ एक नई फ़ाइल बनाने के लिए, जगह में
$ perl -pe 's/^ /\t/' input-file >output-file
संपादन का उपयोग की तरह
$ perl -i.bak -pe 's/^ /\t/' input-file
+1।) – raina77ow
'unexp और -टी 2' –
जो WHOLE स्ट्रिंग में प्रतिस्थापित होगा, मुझे केवल प्रत्येक पंक्ति की शुरुआत की आवश्यकता है। – snoofkin
'- केवल-केवल' (gnu unexpand) –