Standart girdiden okumaya nasıl başlarım? [çiftleme]


91

deniyorum

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

ve almak

unknown option to `s'

Neyi yanlış yapıyorum?

Düzenle:

Yorumlara göre kod aslında doğrudur. Tam kodum aşağıdaki gibi bir şeye benziyordu

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

Görünüşe göre bir sebepten dolayı yorumum sed'e girdi olarak besleniyordu. Çok ilginç.


Dosyanızı değiştirme adı yerine "bu" ile değiştirmek istiyor musunuz?
Teja

2
Hayır, denediğin bu değil. Eksik bir şey daha var.
Ignacio Vazquez-Abrams

6
En iyi tahminim, gerçek durumunuzda bir /in replacemeveya var withthis. Deneyin: 's#replaceme#withthis#g'.
cababunga

4
Yanlış yaptığınız bir şey, bize tam olarak ne yaptığınızı göstermemek. Gösterdiğiniz kod gayet iyi; yürüttüğün şeyle ilgili bir sorunun var; ergo, bize ne yaptığını göstermiyorsun. Çoğu zaman göremediğimiz şeylerde hata ayıklayamayız. Bazen şansımız yaver gider ve doğru tahmin ederiz, ancak tahmin etmemize veya şanslı olmamalıyız.
Jonathan Leffler

1
Grep'in gereksiz kullanımı. Sed ile bunu yapabilirsiniz: sed '/ searchterm / s / kalıp / değiştirme / g' myfile.csv
William Pursell

Yanıtlar:


121

- ifade seçeneğini kullanın

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

+ SOaddict, Bu sadece stdout'a çıktı, myfile.csv dosyasını değiştirmiyor.
Josiah

1
Dosyayı yerinde güncellemek istiyorsanız, cevabımın bu sorunu yeterince çözdüğünü düşünüyorum.
Wes

Görünen her şey grep 'x' y | sed 'z'yeniden düzenlenebilir sed '/x/z' y. Ayrıca bakın işe yaramaz grep.
üçlü

40

sed ifadesini belirtmek için "-e" kullanın

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

1
Sed ifadesini belirtmek için "-e" nin nasıl stdin'den okunabileceğini merak ediyordum. Sed varsayılan olarak stdin'den okunur mu?
Tim

1
Evet. çoğu un * x aracı gibi, sedherhangi bir girdi dosyası yoksa stdin'den okur.
umläute

Teşekkürler. olan -egerekli? Olmadan çalışır -e. Acaba kullanmanın amacı -enedir? Teşekkürler.
Tim

2
OP sorusunu anladığımdan emin değilim. echo foo | sed 's/foo/bar/g'olmadan çalışır -eçıkış olanağı ile, bar. Bu yüzden sorusunu kaçırmış olmalıyım.
Tim

-eYalnızca tek bir komut dosyası ifadeniz olup olmadığını belirtmenize gerek yoktur . Eğer iki tane varsa, sed -e '/foo/!d' -e 's//bar/g'veya diyebilirsiniz sed 's/foo!d;s//bar/g'(veya eşdeğer olarak, noktalı virgül yerine yeni satır ile).
üçlü

6

sedBir dosyadan değil, stdin'den yakalama yapmak için kullanmalısınız -e.

Bunun gibi:

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

Bir dosya içindeki metni yerinde güncellemeye çalışıyorsanız, bunu akılda tutmak çok daha kolaydır.

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. Dosyayı kullanarak açın vi myfile.csv
  2. Basın Escape
  3. Tür :%s/replaceme/withthis/
  4. Yazın :wqve basınEnter

Şimdi dosyanızda yeni kalıba sahip olacaksınız.


11
OP bunu vim ile değil sed ile yapmayı öğrenmek istedi.
Noe Nieto

1
Noe ne dedi. Ayrıca, (kolayca) yazılabilir olmadığı için vim çözümünüz sed alternatiflerinden daha düşüktür.
weberc2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.