sed コマンドを使用して動的単語を置き換える

sed コマンドを使用して動的単語を置き換える

スクリプトが実行されるたびに異なる可能性があるファイルの単語を置き換える必要があります。ファイルの内容は次のとおりです。

class DynamicContentToReplace > Something

ここでは、sedコマンドを使用して[DynamicContentToReplace]を必須コンテンツに置き換える必要があります。 [DynamicContentToReplace]には、スペースを除くすべてを含めることができます。

私たちが取ることができる仮定は、ファイルに次のclass単語を含む行だけが含まれているということです。

希望の出力

class RequiredContent > Something

次のコマンドを試しましたが、 sed -e "s/\(class \)\([^\s]+\)/\1RequiredContent/"まだ内容を変更できませんでした。私はここで何を見逃していますか?私はすでに経験したこれ投稿もします。しかし、解決策が見つかりませんでした。

答え1

  • デフォルトの正規表現では、+数量子をエスケープする必要があります。
  • \+*GNU拡張なので、または代わりに使用する必要があります\{1,\}
  • を使用する[^[:space:]]か、単に[^ ]交換してください[^\s]。 GNUを使用すると、スペースを除くすべてをsed使用できます\S
  • 2番目のグループは\2どこにも使用されないため、キャプチャする必要はありません。
  • sedコマンドが1つしかない場合は必要ありません。-e
  • 不要なものを交換する代わりに、^前に追加したい場合があります。classinstance=my_class_something()

使用:

sed 's/^\(class \)[^[:space:]]*/\1RequiredContent/'

または、拡張正規表現(sed -E)を使用してください。

sed -E 's/^(class )\S+/\1RequiredContent/'

答え2

Perl正規表現演算子を使用していますが、なぜPerlを使用しないのですか?

perl -pe 's/\bclass\s+\K\S+/RequiredContent/g' < your-file
  • \b前に単語文字がない限り、一致する単語境界演算子ですclass
  • \sすべての空白文字(ASCII文字のみ)と一致します。ユーザーのロケールまたはUTF-8に入力をデコードするように指示しなかったため、入力perlはISO8859-1でエンコードされたと解釈されます(幸いにも0xa0バイト、ISO8859-1の非専用対応するu代替エントリにフラグを追加しない場合は、sスペースエンコーディング壊すことは空白とは見なされません。
  • \K一致する文字列の先頭をリセットして後で一致する項目のみを置き換えるため、代替項目に再追加するために以前に出現した項目をキャプチャする必要はありません。
  • \S空白以外の文字です。 Perlでは、これは[^\s]while insedと同じ[^\s]\、およびを除くすべての文字と一致しますs

1PERL_UNICODE環境変数が設定されていないとします。

答え3

私は「クラス」が常に存在し、行の先頭にあると仮定してこれを提示します。

$ sed 's/^class [^ ]*/class RequiredContent/'
class RequiredContent > Something

  • [^ ]*「class」の後に空白以外のすべての内容を「class」と新しい文字列に置き換えます。

関連情報