「sed」を使用した文書およびファイル

「sed」を使用した文書およびファイル

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/stdinLinuxシステムでこれを使用できます。 (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

:)

関連情報