एक स्ट्रिंग के पहले भाग को sed का उपयोग करके निकालें


14

मैं इससे कैसे मिलता हूं:

randomcollege-nt\user90

इसके लिए:

user90

का उपयोग कर sed?


2
एक सहायक टिप: जब आप यह सुनिश्चित नहीं करते हैं कि एक कमांड क्या करता है, तो टाइप करें man the_command_nameऔर आपको कमांड के लिए एक उपयोगी निर्देश मैनुअल मिलेगा। आप www.google.com पर भी जा सकते हैं और "command_name ट्यूटोरियल" में टाइप कर सकते हैं और आपको बहुत सारे चरण-दर-चरण मार्गदर्शिकाएँ मिलेंगी।
DBedrenko

2
sedयात्रा के लिए ट्यूटोरियल : grymoire.com/Unix/Sed.html
पांड्या

जवाबों:


15

मैं grepदेखने के लिए एक सरल का उपयोग करेगा user90:

$ echo "randomcollege-nt\user90" | grep -o user90
user90

यदि user90 स्थिर नहीं है, तो इस कमांड को प्राथमिकता दें:

$ echo "randomcollege-nt\user90" | grep -oP '(?<=randomcollege-nt\\)\w+'
user90

अंत sedमें फ़ाइल को जगह में संपादित करने के लिए उपयोग करना:

$ sed -ri 's/randomcollege-nt\\(user[0-9]+)/\1/' my_file

या सभी संभावित उपयोगकर्ता खातों से मिलान करने के लिए:

$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file

मजेदार बात यह है कि मैंने कोशिश की है और यह कुछ भी नहीं लौटाया। मैं 12.04 का उपयोग कर रहा हूँ अगर वह मायने रखता है। यह केवल दिखाता है कि क्या मैं grep -Fपूरी स्ट्रिंग हूं ।
रोबोमेन 1723

@ Roboman1723 ने 12.04 को परीक्षण किया, मेरा पहला कमांड काम करता है। सुनिश्चित करें कि आपके पास कहीं भी एक grep उर्फ ​​परिभाषित नहीं है। BTW जैसा कि लगता है कि आप इन कमांड के साथ इनलाइन रिप्लेसमेंट की तलाश कर रहे हैं, मैंने ऐसी कमांड जोड़ी है।
सिल्वेन पिनेऊ

क्या कोई ऐसा तरीका है जिससे आप उस sed कमांड को सभी "randomcollege-nt \" काट सकते हैं, लेकिन केवल उपयोगकर्ता 90 से अधिक प्रदर्शित करते हैं? उदाहरण: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 आउटपुट: user90 user91 user92
Roboman1723

1
@ Roboman1723 आपको अपनी मूल फ़ाइल और अपने वांछित आउटपुट को अपने प्रश्न के साथ संलग्न करना चाहिए ताकि हर कोई आपकी मदद करने के लिए तैयार हो सके।
सिल्वेन पिनेउ

1
@SylvainPineau मुझे लगता है कि पहला आदेश एक उपयुक्त नहीं है।
अविनाश राज

20

आप किसी domain\usernameस्ट्रिंग से उपयोगकर्ता नाम निकालने के लिए कुछ पाठ पार्स कर रहे हैं , जो कि विंडोज से सबसे अधिक संभावना है। उपर्युक्त अधिकांश उत्तर केवल आपके विशिष्ट उदाहरण स्ट्रिंग को संबोधित कर रहे हैं।

ऐसा करने का सबसे अच्छा तरीका है कि जो कुछ भी आता है उसे निकालने के लिए sed में regex का उपयोग करना \। यहां बताया गया है कि आप इसे कैसे करेंगे:

sed 's|.*\\\(.*\)|\1|'

जो .*बैकस्लैश तक सब कुछ ( ) से मेल खाएगा (यहां, हम इसे बच रहे हैं, इसलिए यह है \\), फिर बैकस्लैश ( .*) के बाद सब कुछ मैच करें , लेकिन इसे एक कैप्चर ग्रुप (यानी इसके चारों ओर कोष्ठक लपेटें), लेकिन हमें भी बचना होगा उन्हें, इसलिए \(.*\))। अब जब हमारे पास \एक कैप्चर समूह के रूप में स्ट्रिंग के बाद जो कुछ भी आता है , हम इसे संदर्भित करके प्रिंट करते हैं\1

आप उपरोक्त sedकमांड का उपयोग किसी भी डोमेन नाम के साथ कर सकते हैं , जरूरी नहीं randomcollege-nt

$ echo "randomcollege-nt\user90" | sed 's|.*\\\(.*\)|\1|'
user90

$ echo "domain\username" | sed 's|.*\\\(.*\)|\1|'
username

$ echo "anydomainname\roboman1723" | sed 's|.*\\\(.*\)|\1|'
roboman1723

10

एक और sed:

$ echo "randomcollege-nt\user90" | LC_ALL=C sed -e 's/.*\\//'
user90

या POSIXly:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90

1
यह एक बशीवाद नहीं है, यह एक POSIX shविशेषता है। pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h

+1। आपका उत्तर नहीं देखा, मैं ओपी के ^ ^
ओलिवियर दुलैक

9

मुझे पता है कि आप sed का उपयोग करना चाहते हैं, लेकिन मैं कुछ अलग उपयोग करूँगा ...

echo "randomcollege-nt\user90" | cut -d'\' -f2

1
किसी उपकरण का उपयोग कैसे करना है, यह जानना उतना ही महत्वपूर्ण है जितना कि उस उपकरण का उपयोग करना।
राफेल सिलेक

5

क्या यह सवाल है?

$ echo randomcollege-nt\user90| sed -e s,randomcollege-nt\,,
user90

अगर स्टिंग रैंडमकलज-एनटी के विपरीत नहीं है, तो ऊपर / नीचे के awk कमांड का उपयोग करें।


1
जब मैं दौड़ता हूं कि मुझे /user90नहीं मिलता हैuser90
रोबोमेन 1723

2
नहीं, यह ठीक है, मुझे user90 मिला है।
सप्तर्षि नाग

3

बल्कि आप "user90" को फ़िल्टर करने के लिए 'awk' का उपयोग करते हैं:

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}

क्या वे फ़ाइल को जगह में संपादित करने के लिए awk के साथ एक तरीका है और इसे नई फ़ाइल में आउटपुट नहीं करना है?
रोबोमेन 1723

@ Roboman1723 देखें stackoverflow.com/a/16531920/2072269
muru

हां, आपको aw -.F विकल्प का उपयोग करना होगा। विवरण के लिए मैन पेज देखें।
सप्तर्षि नाग


1


sedएक विशिष्ट चरित्र से पहले एक स्ट्रिंग में सब कुछ हटाने के साथ (डबल ब्रैकेट में परिभाषित करें [विशिष्ट चार])।

echo "randomcollege-nt\user90" | sed 's/.*[\]//'

व्हाट्सएप चरित्र के साथ चार ( .*[\]) वर्ण से पहले सभी का मतलब है \( //)

यदि आपके पास कोई फ़ाइल है और आप इस तरह कमांड -iमें उपयोग ध्वज को प्रतिस्थापित करना चाहते हैं sed:

sed -i 's/.*[\]//' /path/to/FileName

1

मूल प्रश्न पूछा गया sed, लेकिन मैं देख रहा हूं कि विकल्प यहां लोकप्रिय हैं।

यदि आप बैश का उपयोग कर रहे हैं, तो पैरामीटर विस्तार सबसे सरल है:

ORIGIN='randomcollege-nt\user90'
echo "${ORIGIN#*\\}"

यदि आप संभावित रूप से एक से अधिक बैकस्लैश की उम्मीद कर रहे हैं, तो हैश के संकेतों को दोगुना करें:

echo "${ORIGIN##*\\}"

अधिक जानकारी के लिए, man bashऔर खोजें Parameter Expansion


0

यदि कोई व्यक्ति # server_tokens off;स्वत: देव-ऑप्स के साथ मदद करने के लिए स्वत: nginx से एक टिप्पणी को हटाने की कोशिश कर रहा है :

sudo sed -ri 's/#\s(server_tokens off;)/\1/' /etc/nginx/nginx.conf

उबंटू 16.04 LTS पर nginx / 1.12.1 के लिए परीक्षण और काम कर रहा है। एनजीआईएनएक्स को लॉक करने से संबंधित उत्तर यहां सर्वर टोकन बंद करके ।

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