sed は引用符の中の単語を置き換えます。

sed は引用符の中の単語を置き換えます。

以下の行を含むファイルがあります。-s引用符内の単語を置き換えて従うことを望みます-e。試しましたがsed成功しませんでした。

文書内容

abc -s "today" -e "today" def
abc -s "yesterday" -e "yesterday" def
abc -s "3 days ago" -e "3 days ago" def

試みたコマンド

sed 's|-s "*" -e "*"|-s "1" -e "2"|g' <filename>

希望の出力

abc -s "1" -e "2" def
abc -s "1" -e "2" def
abc -s "1" -e "2" def

答え1

自分の試みで最大の問題は、これが"*"「ゼロ個以上の二重引用符と他の二重引用符が続く一致」を意味することです。*「前の式が0個以上」を意味する正規表現修飾語だからです。これは、などの文字列"*"と一致することを意味します。""""""

さらに、コマンドに異なる区切り文字を使用する必要はなく、s///1行に複数の代替文字が必要ない場合でも、末尾に区切り文字を使用できます。/gしかし、これは単なるスタイルに関する質問です。


これを行うにはいくつかの方法がありますが、sedすべての方法は任意の方法で二重引用符の間の文字列と一致する必要があります。二重引用符の間の文字列は、"[^"]*"「二重引用符と一致し、ゼロ個以上の二重引用符以外の文字と別の二重引用符文字が続く」正規表現で一致することができます。

$ sed -e 's/-s "[^"]*"/-s "1"/' -e 's/-e "[^"]*"/-e "2"/' file
abc -s "1" -e "2" def
abc -s "1" -e "2" def
abc -s "1" -e "2" def

上から2つを使用する分離式は、指定されたオプションの後に続く文字列と一致して置換します。これは次のことも意味します。

  • 入力に提供されるオプションの順序は重要ではありません(-s "whatever"常に置き換えられ、-s "1"常に-e "whatever"置き換えられます-e "2")。
  • オプション間のスペースの数を無関係にします(たとえば、オプションとオプション引数の間に複数のスペースを許可するように-s "[^"]*"変更されます)。-s *"[^"]*"
  • 他のオプションがあるかどうか(またはそのオプションがオプションとどのように並べ替え-sられる-eか)は重要ではありません。
  • -sどちらか一方があり、-e残りはない場合は、既存のオプションとオプション引数が置き換えられます。

次に始まる行だけを変更する必要がある場合abc

sed -e '/^abc/{' -e 's/-s "[^"]*"/-s "1"/' -e 's/-e "[^"]*"/-e "2"/' -e '}' file

-eまたは、次のオプションがすべてないコマンドは次のとおりですsed

sed '/^abc/{ s/-s "[^"]*"/-s "1"/; s/-e "[^"]*"/-e "2"/; }' file

編集する行がで終わっていることを確認する必要がある場合は、に/^abc/変更してください。/^abc.*def$/def

答え2

Sedはワイルドカードパターンではなく正規表現を使用します。*「前の要素を0回以上繰り返す」を意味し、.「何でも」を意味する繰り返しが必要です。

sed 's/-s ".*" -e ".*"/-s "1" -e "2"/'

関連情報