`sed`とファイルにhere-docを使用する


10

ヒアドキュメントをsedコマンドに使用し、読み取るファイルと出力ファイルを提供したいと思います。

私は、高度なBashスクリプトガイドのヒアドキュメントを見てきましたが、ヒアドキュメントを使用する際の通常の引数については何も触れていません。可能ですか?

私は次のようなことを達成したいと思います:

#!/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;

どんな助けでも本当に感謝しています。

回答:


14

あなたは、GNUは、標準入力からスクリプトを読み込むためにsedを伝えることができ-f --fファイルからスクリプトを読み取ることを意味し、および-コマンドの多くの一般的であるように、標準入力を意味します。

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

POSIX sedもサポート-fしますが-、標準入力でのの使用は文書化されていません。この場合、/dev/stdinLinuxシステムで使用できます(Solarisにもこの機能があることを思い出しているようですが、現時点では確認できません)。

使用して<<-SED_SCRIPT(「 - 」で接頭辞)はクロージングできるようになりますSED_SCRIPTタグがインデントされます。


ありがとう、あなたが言ったことはうまくいきましたが、終了トークンをインデントできないことを指摘したいのですが、それ以外の場合はbashでエラーが発生します。これは、終了トークンに空白も含まれているためだと思います。
Tristian 2012

Apple OS X sedは、標準入力からのスクリプトの読み取りをサポートしていないことに注意してください。(少なくともその方法または他の文書化された方法ではありません。)
danorton 2013年

@danorton:inのサポートを必要としないソリューションを追加しましたが、プロセスの置換が必要です:。-f -sed<( command )
pabouk 2014年

5

場合はsed、スクリプトの読み込みをサポートしていませんstdin(使用-f -)は、使用することができますプロセス置換(利用可能でをbashzshksh93):

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

右括弧)は、終了区切り文字(SEC_SCRIPT)の直後または改行の後に続く必要があります。プロセス置換の場合echo、ヒアドキュメントの代わりに使用することもできます。

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

1
Mac OS Xでは、sedコマンド自体の直後の入力ファイル("$IN"またはtestfile.txt)が気に入らなかった— -e scriptまたはが必要-f fileでした。@paboukの回答を並べ替えるとうまくいきました:sed -f <( cat << ETC ... ETC) "$IN" > "$OUT"
Stephen P

bash 4.2.45および標準BSD sedを備えたMax OSXでは、閉じ括弧は、閉じの下の新しい行になければなりませんSED_SCRIPTでした。
Alexander Klimetschek 2017

-1

多分より良いアプローチ:

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
興味深いですが、要点は別です。OPは、sdinコマンドをstdin経由で渡したいと考えています。
muru 2014年

このアプローチは両方の方法を許可しますが、なぜ反対票ですか?
Magnus

繰り返し:「sdinコマンドをstdin経由で渡す」。あなたが答えると、それはどのような方法でも行われません。
muru 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.