ลบส่วนแรกของสตริงโดยใช้ sed


14

ฉันจะได้รับจากสิ่งนี้:

randomcollege-nt\user90

สำหรับสิ่งนี้:

user90

ใช้งานsed?


2
เคล็ดลับที่มีประโยชน์: เมื่อคุณไม่แน่ใจว่าคำสั่งทำงานอย่างไรให้พิมพ์man the_command_nameและคุณจะได้รับคำแนะนำที่เป็นประโยชน์สำหรับคำสั่ง นอกจากนี้คุณยังสามารถไปที่ www.google.co.th และพิมพ์ "command_name tutorial" แล้วคุณจะพบคำแนะนำทีละขั้นตอนมากมาย
DBedrenko

2
สำหรับการสอนเกี่ยวกับการsedเยี่ยมชม: grymoire.com/Unix/Sed.html
Pandya

คำตอบ:


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สตริงทั้งหมด
Roboman1723

@ Roboman1723 ทดสอบเมื่อวันที่ 12.04 คำสั่งแรกของฉันทำงาน ต้องแน่ใจว่าคุณไม่ได้ระบุนามแฝง grep ไว้ที่ใดที่หนึ่ง BTW เนื่องจากดูเหมือนว่าคุณกำลังมองหาการแทนที่แบบอินไลน์ด้วย sed ฉันได้เพิ่มคำสั่งดังกล่าว
Sylvain Pineau

มีวิธีที่คุณสามารถทำให้คำสั่ง sed ตัดออก "randomcollege-nt \" ทั้งหมด แต่แสดงมากกว่าผู้ใช้ 90 หรือไม่ ตัวอย่าง: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 เอาท์พุท: user90 user91 user92
Roboman1723

1
@ Roboman1723 คุณควรแนบไฟล์ต้นฉบับของคุณและผลลัพธ์ที่ต้องการกับคำถามของคุณเพื่อให้ทุกคนยินดีที่จะช่วยให้คุณเห็น
Sylvain Pineau

1
@SylvainPineau ฉันคิดว่าคำสั่งแรกไม่เหมาะสม
Avinash Raj

20

คุณกำลังแยกวิเคราะห์ข้อความเพื่อดึงชื่อผู้ใช้ออกจากdomain\usernameสตริงส่วนใหญ่น่าจะมาจาก Windows คำตอบส่วนใหญ่ข้างต้นเป็นเพียงการระบุสตริงตัวอย่างเฉพาะของคุณ

วิธีที่ดีที่สุดที่จะทำคือการใช้ regex ใน sed \เพื่อสารสกัดจากสิ่งที่เกิดขึ้นหลังจากที่ นี่คือวิธีที่คุณจะทำ:

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
มันไม่ใช่เรื่องน่าเบื่อ แต่เป็นshคุณลักษณะPOSIX pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h

+1 ไม่เห็นคำตอบของคุณฉันจะลบความคิดเห็นของฉันใน OP ของ ^^
Olivier Dulac

9

ฉันรู้ว่าคุณต้องการใช้ sed แต่ฉันจะใช้สิ่งที่แตกต่าง ...

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

1
รู้วิธีการใช้เครื่องมือเป็นเพียงที่สำคัญเป็นที่รู้ซึ่งเครื่องมือในการใช้งาน
RafałCieślak

5

นี่เป็นคำถามหรือไม่

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

หาก sting randomcollege-nt ไม่ต่อเนื่องให้ใช้คำสั่ง awk ด้านบน / ด้านล่าง


1
เมื่อฉันทำงานที่ฉัน/user90ไม่ได้รับuser90
Roboman1723

2
ไม่เป็นไรฉันได้ user90
saptarshi nag

3

ค่อนข้างคุณใช้ 'awk' เพื่อกรอง "user90":

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

พวกเขากำลังใช้วิธี awk เพื่อแก้ไขไฟล์ในสถานที่และไม่ต้องส่งออกไปยังไฟล์ใหม่หรือไม่?
Roboman1723


ใช่คุณต้องใช้ตัวเลือก -f เพื่อ awk สำหรับรายละเอียดดู man page
saptarshi nag


1


ด้วยการsedลบทุกอย่างในสตริงก่อนอักขระที่เฉพาะเจาะจง (กำหนดเป็นวงเล็บคู่ [อักขระเฉพาะ]]

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

หมายถึงแทนที่.*[\]อักขระทั้งหมด ( ) หน้า\อักขระที่มีช่องว่าง ( //)

หากคุณมีไฟล์และต้องการแทนที่แทนที่ใช้-iflag ในsedคำสั่งดังนี้:

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

1

คำถามเดิมถามsedแต่ฉันเห็นว่าทางเลือกเป็นที่นิยมที่นี่

หากคุณใช้ Bash การขยายพารามิเตอร์จะง่ายที่สุด:

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

หากคุณคาดหวังว่าจะมีเครื่องหมายทับขวามากกว่าหนึ่งเครื่องหมายให้เพิ่มเครื่องหมายแฮชเป็นสองเท่า:

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

สำหรับข้อมูลเพิ่มเติมและการค้นหาสำหรับman bashParameter Expansion


0

ในกรณีที่ทุกคนพยายามลบความคิดเห็นออก# server_tokens off;จาก nginx โดยอัตโนมัติเพื่อช่วยเหลือ auto dev-ops:

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

ผ่านการทดสอบและใช้งานกับ nginx / 1.12.1 บน Ubuntu 16.04 LTS คำตอบที่เกี่ยวข้องกับการล็อคลง NGINX โดยการปิดเซิร์ฟเวอร์โทเค็นนี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.