sed
インプレース編集
サーチ…
構文
- sed -I extension - FreeBSD sed(連続ラインカウンタ)
- sed -I [ extension ] - NetBSDとIllumos sed(連続ラインカウンタ)
- sed -i 拡張子 - FreeBSD sed
- sed -i [ extension ] - NetBSD、OpenBSD、Illumos、BusyBoxおよびGNU sed
- sed --in-place [= extension ] - Illumos、BusyBox、およびGNU sed
パラメーター
パラメータ | 詳細 |
---|---|
extension | 指定した拡張子を持つバックアップファイルを保存するか、 extension が長さゼロの文字列の場合はバックアップファイルを保存しないでください。 |
備考
インプレース編集は、最近の大多数のシステムに存在する一般的ではあるが非標準の拡張です。
(このようなセクションは現在のすべてのBSD sed
マニュアルとその派生品のセクションにあります)
ディスクの空き容量がなくなった場合の破損や部分的な内容の危険性があるため、ファイルの編集時には長さゼロの拡張子を付けることはお勧めしません。
強大なed
忘れないで
そこに使用間違いなくsed
とのインプレース編集機能のためのsed
、しかし、UNIXの標準を拡張した場合、古いUNIXの標準は、その機能が含まれていなかった理由を、私たちは常に尋ねる必要があります。 UNIXは完璧ではありませんが、ツールの直交性と完全性は、少なくとも1970年頃に見える場所では、 テキスト編集と自動テキスト編集がその間に確実に目に見えるように、完全に近づくように開発されました。
実際、 sed
の考え方は、 ファイルを編集するのではなく、 ストリームを編集することです 。だからsed
という名前はストリームエディタの短い形式です。 s
取り除くと、実際にファイル編集用に設計されたツールが得られます ed
:
printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file
またはcat file_edit_commands | ed file
。
ファイル内の文字列をインプレースで置き換える
sed -i s/"what to replace"/"with what to replace"/g $file
$file
を使用してインプレース編集を選択するには、 -i
を使用します。いくつかのシステムでは、元のファイルのバックアップを作成するために使用される-i
フラグの後に接尾辞を追加する必要があります。 -i ''
ような空の文字列を追加して、バックアップの作成を省略できます。このトピックの-i
オプションについては、 備考を参照してください。
g
ターミネータは、各行でグローバルな検索/置換を行うことを意味します。
$ cat example
one
two
three
total
$ sed -i s/"t"/"g"/g example
$ cat example
one
gwo
ghree
gogal
携帯用
インプレース編集は、共通ではあるが非標準の機能です。実行可能な代替案は、中間ファイルを使用してオリジナルまたは出力を格納することです。
sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file
GNUとFreeBSDの両方の構文で-i
オプションを使用するには、拡張子を指定して-i
オプションに追加する必要があります。次の2つは、両方で受け入れられ、 file.orig
の元のバージョンとfile
編集されたバージョンの2つのファイルを生成しfile
。
sed -i.orig 'sed commands' file
ファイルfile
指定した場合の基本的な例を参照してください。
$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file # the original file has changed its content
XX
two
three
$ cat file.orig # the original content is now in file.orig
one
two
three
より複雑な例です。各行を行番号で置き換えます。
$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2
バックアップファイルが必要な理由
バックアップファイルなしでインプレース編集を使用するには、 -i
長さゼロの引数を与えなければならず、FreeBSD sed
は-i
オプションを追加するか別個にする必要がありますが、GNUオプションの引数拡張では引数を追加する必要があります。 -i
。両方のサポートが-i
に引数を追加しますが、それが必要ではありません。- -i extension
-i'' command
は-i extension
と区別がつかないため、長さ0の引数を-i
に追加することはできません。
バックアップファイルを指定せずにインプレース編集を行うと、読み取り専用アクセス権がオーバーライドされます
sed -i -e cmd file
は、そのアクセス権が読み取り専用に設定されていてもsed -i -e cmd file
を変更しfile
。
このコマンドは、
sed -e cmd file > tmp; mv -f tmp file
のではなく
sed -e cmd file > tmp; cat tmp > file; rm tmp
次の例では、gnu sed
使用しています。
$ echo 'Extremely important data' > input
$ chmod 400 input # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)
これは、 i
オプションを指定してSUFFIX
を指定してバックアップを作成することで軽減できます。
$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data