Sed için bir doc-dosyası ve bir dosya kullanma


10

Sed komutları için burada-doc kullanmak ve okunacak dosyayı ve çıktı dosyasını sağlamak istiyorum.

Gelişmiş Bash Scripting kılavuzundan Here-Documents'a baktım, ancak burada-doc kullanımında düzenli argümanlar hakkında hiçbir şeyden bahsetmiyor. Hatta mümkün mü?

Aşağıdaki gibi bir şey elde etmek istiyorum:

#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt

sed $IN << SED_SCRIPT
    s/a/1/g
    s/test/full/g

SED_SCRIPT 
> $OUT;

Herhangi bir yardım gerçekten takdir edilmektedir.

Yanıtlar:


14

Sen GNU ile standart girdiden senaryoyu okumak için sed söyleyebilir -f -, -fbir dosyadan senaryoyu okumak için anlamı ve -komutların bir sürü ortak olduğu gibi standart girdi anlamına gelir.

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT

POSIX sed de destekler -f, ancak -standart giriş için kullanımı belgelenmemiştir. Bu durumda, /dev/stdinLinux sistemlerinde kullanabilirsiniz (ve Solaris'in de buna sahip olduğunu hatırlıyorum, ancak şu anda bunu doğrulayamıyorum)

Kullanılması <<-SED_SCRIPT( '-' ile önek) kapanış sağlayacak SED_SCRIPTetiket girintili edilecek.


Teşekkür ederim, ne dediğini, kapanış jetonunun girintili olamayacağına nasıl işaret etmek istediğimi, aksi halde bash'da bir hataya neden olduğunu düşünüyorum, bunun kapanıştaki beyaz boşluğu da içerdiği için varsayıyorum.
Tristian

Apple OS X sed'in standart girdiden komut dosyası okumayı desteklemediğini unutmayın. (En azından bu şekilde ya da başka herhangi bir şekilde belgelenmiş şekilde değil.)
danorton

@danorton: Bir eklemiş çözeltisi destek gerektirmez -f -olarak sedancak işlem ikame gerektirir: <( command ).
pabouk

5

Durumunda sedbir komut dosyası okuma desteklemez stdin(kullanarak -f -, siz kullanabilirsiniz) işlem ikame (mevcut içinde bash, zsh, ksh93):

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)

Kapatma parantezinin hemen veya bir satır )sonundan sonra bitiş sınırlayıcısını ( SEC_SCRIPT) izlemesi gerekir . Süreç ikamesi durumunda, echoburada yer alan bir belge yerine şunları da kullanabilirsiniz :

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )

1
Mac OS X'te sed komutunun hemen ardından giriş dosyasını ( "$IN"veya hatta testfile.txt) beğenmedi - bir -e scriptveya istedi -f file. @Pabouk'un cevabını yeniden düzenlemek benim için çalıştı:sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
Stephen P

Bas 4.2.45 ve standart BSD sed özellikli Max OSX'te, kapanış parantezlerinin kapanışın altında yeni bir satırda olması gerekiyordu SED_SCRIPT.
Alexander Klimetschek

-1

Belki daha hoş bir yaklaşım:

OUT=/dev/stdout

IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT < $IN

IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT <<< $IN

:)


1
İlginç, ama konunun yanı sıra. OP sed komutlarını stdin ile geçmek istiyor.
muru

Bu yaklaşım her iki yönteme de izin verir.
Magnus

Tekrarlayın: "sed komutlarını stdin üzerinden geçirin". Cevabınız bunu herhangi bir yöntemle yapmaz.
muru
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.