एक फ़ाइल में निम्नलिखित सूची है:

abc.class1 def.class2 ghi.class1.class2 .class1.class2 
abc.class3 def.class4 ghi.class3.class4 .class3.class4

अपेक्षित उत्पादन:

.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4

निम्नलिखित sed कमांड का उपयोग करना

sed 's/^.*\././g' 

देता है

output:
.class2
2
Sharad Shrestha 8 जिंदा 2022, 02:30

8 जवाब

एक sed के साथ जिसमें ERE के लिए -E है, उदा। जीएनयू या बीएसडी सेड्स:

$ sed -E 's/(^| )[^.]+/\1/g' file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4

अन्यथा किसी भी sed के साथ:

$ sed 's/^[^.]*//; s/ [^.]*/ /g' file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4
2
Ed Morton 8 जिंदा 2022, 07:05

यदि आप स्ट्रिंग फ़ील्ड को . से प्रारंभ नहीं करते हैं, तो आप स्ट्रिंग फ़ील्ड को ट्रिम करने के लिए awk का उपयोग कर सकते हैं:

awk '{for (i=1;i<=NF;i++) sub(/^[^.]*\./,".",$i)} 1' file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4
1
dawg 8 जिंदा 2022, 02:43

match और substr का उपयोग करके एक awk दृष्टिकोण

awk '{for(i=1;i<=NF;i++){match($i,"\.c"); $i=substr($i,RSTART,length($i))}}1' file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4
1
Andre Wildberg 8 जिंदा 2022, 03:11

sed का उपयोग करना

$ sed 's/[^.]*\(\.[^ ]* \)/\1/g' input_file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4
0
HatLess 8 जिंदा 2022, 03:41

मैं निम्नलिखित तरीके से इस कार्य के लिए GNU AWK का उपयोग करूंगा, file.txt सामग्री होने दें

abc.class1 def.class2 ghi.class1.class2 .class1.class2 
abc.class3 def.class4 ghi.class3.class4 .class3.class4

फिर

awk 'BEGIN{FPAT="\\.[^ ]*"}{$1=$1;print}' file.txt

उत्पादन

.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4

स्पष्टीकरण: AWK को सूचित करने के लिए FPAT (फ़ील्ड पैटर्न) का उपयोग करें कि फ़ील्ड शाब्दिक . है जिसके बाद शून्य या अधिक गैर-रिक्त स्थान हैं। $1=$1 लाइन के पुनर्निर्माण को ट्रिगर करता है, print उक्त लाइन को प्रिंट करता है।

(GNU Awk 5.0.1 में परीक्षण किया गया)

0
Daweo 8 जिंदा 2022, 11:21
gawk -F. -v OFS=. -v RS='[[:space:]]' '{ $1 = ""; printf "%s", $0 RT }' file
0
konsolebox 8 जिंदा 2022, 15:17

gsub() फ़ंक्शन के साथ awk का उपयोग करना:

awk '{gsub(/[[:alpha:]]+\./,".")} 1' file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4
  • या जीएनयू awk gensub() फ़ंक्शन:
awk '{print gensub(/[[:alpha:]]+\./,".","g")}' file
.class1 .class2 .class1.class2 .class1.class2
.class3 .class4 .class3.class4 .class3.class4
-1
Carlos Pascual 8 जिंदा 2022, 14:34

आपका ^.*\. पैटर्न एक स्ट्रिंग के एक हिस्से से शुरू से लेकर स्ट्रिंग में एक शाब्दिक . की अंतिम घटना तक मेल खाता है, इसलिए अंत में, एक लाइन का यह पूरा हिस्सा हटा दिया जाता है (एक बिंदु के साथ) )

आप उपयोग कर सकते हैं

#!/bin/bash
s='abc.class1 def.class2 ghi.class1.class2 .class1.class2 
abc.class3 def.class4 ghi.class3.class4 .class3.class4'
sed -E 's/( |^)[^ .]+\./\1./g'  <<< "$s"

ऑनलाइन डेमो देखें। पॉज़िक्स ईआरई रेगेक्स मेल खाता है

  • ( |^) - समूह 1 (\1): एक स्पेस या स्ट्रिंग की शुरुआत
  • [^ .]+ - स्पेस और डॉट के अलावा एक या अधिक वर्ण
  • \. - एक शाब्दिक . चार।

प्रत्येक मैच को समूह 1 मान + . से बदल दिया जाता है।

2
Wiktor Stribiżew 8 जिंदा 2022, 02:33