インプレース引数のための複数の表現を使用したsed


23

を使用してファイル内の複数の単語を置き換えようとしています sed -i #expression1 #expression2

ファイル

Something  123 item1
Something  456 item2
Something  768 item3
Something  353 item4

出力(望ましい)

anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

トライアウト

sed -iforを2回使用すると、次の出力を取得できます。

 sed -i 's/Some/any/g' file
 sed -i 's/item/stuff/g' file

これを単一のインプレースコマンドとして作成する方法はありますか

sed -i 's/Some/any/g' -i 's/item/stuff/g' file

上記のコードを試してみたときs/item/stuff/g、ファイルとして取得し、作業を試みます。


あなたのファイルは(つまり、彼らは同じパターンに従ってください)上記の例と類似している場合、あなたは、単一の置換でそれを行うことができます:sed - i 's/Some\(.*\)item/any\1stuff/' file
don_crissti

回答:


26

sedシステムのバージョンに応じて、できることがあります

sed -i 's/Some/any/; s/item/stuff/' file

ここでコマンドのg最後のスラッシュの後には必要ありませんs。1行につき1つの置換のみを行うためです。

代わりに:

sed -i -e 's/Some/any/' -e 's/item/stuff/' file

この-iオプションはsed、所定の場所でファイルを編集するように指示します。直後の文字がある場合は-i、その後sed、元のファイルのバックアップを作成し、バックアップファイルの拡張子としてこれらの文字を使用しています。例えば、

sed -i.bak 's/Some/any/; s/item/stuff/' file

または

sed -i'.bak' 's/Some/any/; s/item/stuff/' file

file、オリジナルを保存して、修正しfile.bakます。

もちろん、Unix(またはUnixライク)システムでは、通常、「。bak」ではなく「〜」を使用します。

sed -i~ 's/Some/any/;s/item/stuff/' file

2
GNUバリアントを記述していることに注意してください。BSDバリアント(FreeBSDやOS / Xなど)では、の引数が必要です-i。そうsed -i '' 's/a/b/;s/c/d/' fileか、sed -i .back 's/a/b/;s/c/d/'またはsed -i.back 's/a/b/;s/c/d/'そこに。他のsed実装は一般にサポートしません-i
ステファンシャゼル14

@StéphaneChazelasに感謝します。そして、GNU sed では拡張機能と拡張機能の間にスペースを入れることはできないと言って、もっと明確にすべきだったと思い-iます。
PM 2Ring 14

sed -i 's/$username = "root"/$username = "newuser"/; s/$password = "password"/$password = "passwd"/; s/$dbname="handicraftstore"/$dbname="handicraft"' Web/database.phpresults sed: -e expression #1, char 141: unterminated s '
コマンド `-alhelal

@alhelal申し訳ありませんが、コメントは質問するのに適切な場所ではありません。とにかく、最後のsコマンドにはfinalがありません/
PM 2Ring

@ PM2Ring私はそれがあなたのソリューションに関連していると私が推測したことに気づかなかったので。しかし、ありがとう。
alhelal

10

「;」でsed式を連結できます

%sed -i 's/Some/any/g;s/item/stuff/g' file1
%cat file1
anything  123 stuff1
anything  456 stuff2
anything  768 stuff3
anything  353 stuff4

5

複数の-eオプションを使用した複数の式:

sed -i.bk -e 's/Some/any/g' -e 's/item/stuff/g' file

または、1つだけを使用できます。

sed -i.bk -e 's/Some/any/g;s/item/stuff/g' file

OSX sedsedなどのの一部の実装が空の拡張子では機能しないため、バックアップファイルの拡張子を指定する必要があります(元のファイルをオーバーライドするために使用する必要があります)。sed -i ''


1

ExモードでVimを使用できます。

ex -sc '%s/Some/any/|%s/item/stuff/|x' file
  1. % すべての行を選択

  2. s 代替

  3. x 保存して閉じます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.