ฉันจะอ่าน sed จากอินพุตมาตรฐานได้อย่างไร [ซ้ำ]


91

ฉันกำลังพยายาม

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'

และได้รับ

unknown option to `s'

ผมทำอะไรผิดหรือเปล่า?

แก้ไข:

ตามความคิดเห็นรหัสถูกต้องจริง รหัสเต็มของฉันมีลักษณะดังต่อไปนี้

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'
# my comment

และดูเหมือนว่าด้วยเหตุผลบางประการความคิดเห็นของฉันจึงถูกป้อนเข้าสู่ sed ที่แปลกมาก.


คุณต้องการแทนที่ไฟล์ของคุณด้วย 'withthis' แทนชื่อแทนหรือไม่?
Teja

2
ไม่นั่นไม่ใช่สิ่งที่คุณกำลังพยายาม มีบางอย่างที่ขาดหายไป
Ignacio Vazquez-Abrams

6
เดาที่ดีที่สุดของฉันคือว่าในกรณีที่แท้จริงของคุณคุณมี/ในหรือreplaceme withthisลอง: 's#replaceme#withthis#g'.
cababunga

4
สิ่งหนึ่งที่คุณทำผิดคือไม่ได้แสดงให้เราเห็นว่าคุณกำลังดำเนินการอะไร รหัสที่คุณแสดงนั้นใช้ได้ คุณมีปัญหากับสิ่งที่คุณกำลังดำเนินการ เอ่อคุณไม่ได้แสดงให้เราเห็นว่าคุณกำลังดำเนินการอะไร เราไม่สามารถแก้ไขสิ่งที่เรามองไม่เห็นได้โดยส่วนใหญ่แล้ว บางครั้งเราจะโชคดีและเดาถูก แต่เราไม่ควรต้องเดาหรือโชคดี
Jonathan Leffler

1
การใช้ grep อย่างไร้ประโยชน์ ด้วย sed คุณสามารถทำได้: sed '/ searchterm / s / pattern / replacement / g' myfile.csv
William Pursell

คำตอบ:


121

ใช้ตัวเลือก - นิพจน์

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'

+ SOaddict นี่เป็นเพียงการส่งออกไปยัง stdout แต่ไม่ได้เปลี่ยน myfile.csv
Josiah

1
หากคุณต้องการอัปเดตไฟล์แทนฉันคิดว่าคำตอบของฉันช่วยแก้ปัญหานั้นได้อย่างเพียงพอ
Wes

ทุกสิ่งที่ดูเหมือนgrep 'x' y | sed 'z'สามารถปรับโครงสร้างsed '/x/z' yใหม่ได้ ดูการใช้grep.
tripleee

40

ใช้ "-e" เพื่อระบุ sed-expression

cat input.txt | sed -e 's/foo/bar/g'

1
ฉันสงสัยว่าการใช้ "-e" เพื่อระบุ sed-expression จะทำให้ sed อ่านจาก stdin ได้อย่างไร? โดยค่าเริ่มต้น sed อ่านจาก stdin หรือไม่?
ทิม

1
ใช่. เช่นเดียวกับเครื่องมือ un * x ส่วนใหญ่sedอ่านจาก stdin หากไม่มีไฟล์อินพุตอยู่
umläute

ขอบคุณ. เป็น-eสิ่งที่จำเป็น? -eมันทำงานได้โดยไม่ต้อง ฉันสงสัยว่าจุดประสงค์ของการใช้-eคืออะไร? ขอบคุณ.
ทิม

2
ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของ OP echo foo | sed 's/foo/bar/g'ทำงานได้โดยไม่ต้อง-eส่งbarออก ดังนั้นฉันต้องพลาดคำถามของเขา
ทิม

ไม่จำเป็นต้องระบุ-eว่าคุณมีเพียงคำสั่งสคริปต์เดียวหรือไม่ หากคุณมีสองตัวคุณสามารถพูดsed -e '/foo/!d' -e 's//bar/g'หรือsed 's/foo!d;s//bar/g'(หรือเทียบเท่ากับขึ้นบรรทัดใหม่แทนอัฒภาค)
tripleee

6

ในการsedจับจาก stdin แทนที่จะใช้ไฟล์คุณควรใช้-e.

แบบนี้:

curl -k -u admin:admin https://$HOSTNAME:9070/api/tm/3.8/status/$HOSTNAME/statistics/traffic_ips/trafc_ip/ | sed -e 's/["{}]//g' |sed -e 's/[]]//g' |sed -e 's/[\[]//g' |awk  'BEGIN{FS=":"} {print $4}'

2

หากคุณกำลังพยายามอัปเดตข้อความภายในไฟล์แบบแทนที่อยู่ในใจฉันคิดว่านี่เป็นเหตุผลที่ง่ายกว่ามาก

grep -Rl text_to_find directory_to_search 2>/dev/null | while read line; do  sed -i 's/text_to_find/replacement_text/g' $line; done


-17
  1. เปิดไฟล์โดยใช้ vi myfile.csv
  2. กด Escape
  3. ประเภท :%s/replaceme/withthis/
  4. พิมพ์:wqและกดEnter

ตอนนี้คุณจะมีรูปแบบใหม่ในไฟล์ของคุณ


11
OP อยากรู้ว่าทำยังไงกับ sed ไม่ใช่ vim
Noe Nieto

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