sed は、特定の区切り文字の間の別の文字の前に文字を追加します。

sed は、特定の区切り文字の間の別の文字の前に文字を追加します。

だから私は次の質問に答えたいです。sed + 存在しない場合のみ、文字列の前に単語を追加します。そしてsed - 前の文字が特定の文字ではない場合、文字列の文字を置き換えます。そしてさらに一歩進んでください。

_に完全に変更したいファイルがありますが、\_2つの制限があるとしましょう。

  1. _すでに移転がある場合は何も\起こらないことを願っています。 (私たちは一度も受けたことがないので\\心配しないでください)
  2. 私たちはしなければならないただ_2つの区切り記号の前に表示される場合は、次のように置き換えます。たとえば、とのstart[間です]end

たとえば、次のようになります。

Pretending_we have \_ some start[text that\_is really_cool]end.
Then \_nothing_ would start[happen_ to\_ that crew_]end

に変換されます

Pretending_we have \_ some start[text that\_is really\_cool]end.
Then \_nothing_ would start[happen\_ to\_ that crew\_]end

メモ:\_場合によっては、各インスタンスを未使用のインスタンスに置き換えてから、すべてのインスタンスをそのインスタンス_に置き換え\_て、最初の変更を元に戻すようにsedを接続したいと思います。しかし、コードに他のどの文字があるのか​​わからないので、そうしたくはなく、可能であれば自分でやりたいです。

また、vimと端末でこれを行う予定です(vimが動作していることを確認するためにテストとして実行し、次に端末で11個の異なるファイルを処理します)。場合に備えて言及します。

編集する:提起されたいくつかの質問に答えるには:

  1. perl/sed/vim はすべて、この問題を処理するために許可される方法です。最善のアプローチが何であるかよくわかりません。私はsed / vimの正規表現に慣れているので、これについて言及しました。 (sedとvimを混同して混乱を引き起こしたようです。その点について非常に残念です。私はほとんどの正規表現要件にsedとvim正規表現を使用することに慣れています。 sedとvimで完全に動作するので、彼らは同じ正規表現処理を使用すると仮定しますが、それはおそらく私が作るべき安全な仮定ではないでしょう、そしてそれについて調べます。
  2. Ubuntuを使用しています。
  3. 一般に、開始/終了区切り記号は同じ行にあるので、理論的には安全な仮定になることができます(たとえ方法を知っていれば行は重要ではありませんが、将来の人々には見てみることも有益です。

ベストアンサー1

私はperlそれを使用します:

perl -pe 's{start\[.*?\]end}{$& =~ s{\\?_}{\\_}gr}ge' < your-file

sすべての(gstart[...]endシーケンスを同じシーケンス($&正規表現が一致するものを含む)に置き換え、オプションで()の前にあるすべての()を置き換えてs返します。このフラグは、replacement()がコードとして評価されることを示します。rg_?\\_e$& =~ s{\\?_}{\\_}gre

入れ子になっていないとしますstart[...]end

start[...]endsが複数行にまたがる可能性がある場合は、-0777入力が一度に1行ではなく全体として処理されるように、このオプション(レコード区切り文字を不可能な値に設定)を追加します。


s/pattern/replacement/flags¹inと同じ方法を使用してくださいsed。ただし、in ではperl作成することもできますs{pattern}{replacement}flags。これはネストと読みやすさに役立ちます。

おすすめ記事