3

こんにちは、私はこのフォーラムが初めてです。SED を使用して、ファイルの偶数行の式を置き換えたいと考えています。私の問題は、元のファイルの変更を保存する方法 (つまり、ファイルの変更を上書きする方法) が思いつかないことです。私は試してみました:

sed -n 'n;p;' filename | sed 's/aaa/bbb/'

しかし、これは変更を保存しません。これについてあなたの助けに感謝します。

4

4 に答える 4

8

試す :

sed -i '2~2 s/aaa/bbb/' filename

-i オプションはsed、その場で作業するように指示するため、編集されたバージョンをスタウトに書き込んで元のファイルをそのままにするのではなく、変更をファイルに適用するように指示します。この2~2部分は、sed がコマンドを適用する必要がある行のアドレスです。2~2偶数行のみを編集することを意味します。 1~2奇数行のみを編集します。5~65行目から始めて、5行ごとに編集します...

于 2012-06-01T19:54:13.773 に答える
5

@Mithrandirの答えは、優れた、正しく、完全なものです。

m~nアドレス指定方法はGNU sed 拡張であり、どこでも機能しない可能性があることを付け加えておきます。たとえば、すべての Mac に GNU sed があるわけではなく、*BSD システムにもない場合があります。

したがって、次のようなファイルがあるとします。

$ cat f
1   ab
2   ad
3   ab
4   ac
5   aa
6   da
7   aa
8   ad
9   aa

...これがより普遍的な解決策です:

$ sed '2,${s/a/#A#/g;n}' f
1   ab
2   #A#d
3   ab
4   #A#c
5   aa
6   d#A#
7   aa
8   #A#d
9   aa

それは何をするためのものか?コマンドのアドレスは です。これは、2 番目の行 ( ) と最後の行 ( )2,$の間のすべての行に適用されることを意味します。コマンドは実際には 2 つのコマンドであり、角かっこ (と) でグループ化されているため、1 つとして扱われます。最初のコマンドは replacementです。2 つ目は、現在の反復で次の行を取得し、それを現在のパターン スペースに追加するコマンドです。したがって、現在の反復では現在の行と次の行が出力され、次の反復では次の次の行が処理されます。2行目から始めたので偶数行ごとにやってます。2${}s/a/#A#/gn

もちろん、元のファイルを更新したいので、-iフラグを付けて呼び出す必要があります。これらの非 GNU sed の一部では、ファイル名に拡張子を追加するフラグにパラメーターを指定する必要があることに注意してください。-iこのファイル名は、古い内容で生成されたバックアップ ファイルの名前です。(したがって、たとえば を呼び出すとsed -i.bkp s/a/b/ myfile.txt、ファイルmyfile.txtは変更されますが、 という別のファイルがの古い内容でmyfile.txt.bkp作成されます。) a) 一部の場所で必要であり、b) GNU sed で受け入れられているためc) それにもかかわらず、それは良い習慣です (何か問題が発生した場合は、バックアップを再利用できます)。私はそれを使用することをお勧めします:myfile.txt

$ ls
f
$ sed -i.bkp '2,${s/a/#A#/g;n}' f
$ ls
f  f.bkp

とにかく、私の答えは、いくつかの特定のシナリオを補完するものです。私はLinuxユーザーであっても、@Mithrandirのソリューションを使用します:)

于 2012-06-01T20:33:11.727 に答える
0

これはあなたのために働くかもしれません:

sed -i 'n;s/aaa/bbb/' file
于 2012-06-01T21:09:24.543 に答える
-1

sed -iファイルをその場で編集するために使用します。

于 2012-06-01T19:47:22.200 に答える