sedコマンドのhere-docを使用し、読み取るファイルと出力ファイルを提供したいと思います。
私は見たことがないここにファイルAdvanced Bash Scripting Guideにありますが、ここで説明されている一般的なパラメータの使用については言及しません。可能ですか?
私は次の目標を達成したいと思います。
#!/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;
どんな助けでも大変感謝します。
答え1
sedを使用して、GNU sedに標準入力からスクリプトを読み取るように指示できます-f -
。-f
これはファイルからスクリプトを読み取ることを意味し、-
多くのコマンドで一般的に使用される標準入力を意味します。
sed -f - "$IN" > "$OUT" << SED_SCRIPT
s/a/1/g
s/test/full/g
SED_SCRIPT
POSIX sedもサポートされていますが、標準-f
入力の使用は-
文書化されていません。この場合、/dev/stdin
Linuxシステムでこれを使用できます。 (Solarisにもこれがあることを覚えているようですが、今は確認できません。)
(プレフィックス「-」)を使用すると、<<-SED_SCRIPT
閉じるSED_SCRIPT
タグをインデントできます。
答え2
(使用)sed
でサポートされていない場合stdin
-f -
プロセスの交換(bash
、、、でzsh
見つけることができますksh93
):
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" )
答え3
次のように複数の式を使用するのはどうですか-e
?
#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt
sed
-e "s/a/1/g" \
-e "s/test/full/g" \
$IN > $OUT
より小さいインライン sed スクリプトの場合は、読みやすくなります。ところで、sedの内部編集を使用することもできます。
sed -i.org
-e "s/a/1/g" \
-e "s/test/full/g" \
$IN
これにより、ソースファイルが入力ファイルの下に保存され、${IN}.org
変更が入力ファイルに適用されます。
答え4
たぶん、より良いアプローチがあるかもしれません。
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
:)