2017-12-05 8 views
1

与えられたパスに対して、標準のLinuxシェルコマンドを使用して、そのパス内のすべてのファイルまたはそのパスのサブディレクトリをテキストで囲みたい。指定されたテキストで正規表現を再帰的にラップする

具体的には、すべてのsyslogコマンドをsyslog(LOG_INFO,json_encode($obj));などのassertコマンドでラップすると、assert(syslog(LOG_INFO,json_encode($obj)));になります。

次のように動作する可能性がありますが、sed: -e expression #1, char 47: Invalid preceding regular expressionエラーが発生しました。 Wiktor第Stribiżewの答えに応じて

sed -i -E "s/(?<=syslog\()(.*)(?=\);)/assert(syslog(\1));/" /path/to/somewhere 

BACKUPの情報

私は前にsedを使用したことがありません。あなたの答えの私の理解を確認してください。代わりに

sed -i "s/syslog(\(.*\));/assert(syslog(\1));/g" /path/to/somewhere 
  • -i編集ファイルを。まず、画面上で何が変更されるかを見ることができます。
  • s代替テキストは、
  • パターンと置換(すなわち/pattern/replacement/)を囲む3 /」sはdeliminatorであり、任意の単一の文字だけでなく/することができます。
  • syslog(\(.*\)); 1つのプレースホルダを持つパターン。エスケープされたかっこを使用します。
  • assert(syslog(\1));置き換えサブストリングにエスケープされた1(または23など)を使用した置換。
  • g最初の一致だけでなくすべてを置き換えます。

sed -i "s/syslog(.*);/assert(&);/g" /path/to/somewhereでも同様ですか?

答えて

1

sedパターンでは、(?<=...)(?=...)のようなルックアラウンドはサポートされていません。

あなたはキャプチャグループ/交換用バックリファレンスを使用することがあります。パターンは非常にあなたがエスケープ括弧を使用する必要がキャプチャグループを定義するには、BRE POSIXの風味のある(ない-Eオプションが渡されない)

sed -i "s/syslog(\(.*\));/assert(syslog(\1));/g" /path/to/somewhere 

、およびエスケープされていないものはリテラルカッコと一致します。

詳細

  • syslog(からsyslog(サブ
  • \(.*\) - グループ1:);
  • 、できるだけ多くの任意の0+文字 - );サブ

交換がありますassert(syslog(\1));、つまり一致assert(syslog(、グループ1の内容、次に));に置き換えられています。

+0

ありがとうWiktor。前に 'sed'を使ったことはありません。私の編集したオリジナルの質問を見て、それが正確かどうかを確認してください。ありがとう – user1032531

+0

また、これは単一の通常のファイル '/ path/to/somewhere'でも動作しますか? '/ path/to/somewhere'がディレクトリで、これとサブディレクトリのすべてのファイルに適用したいのですが? – user1032531

+0

ああ、どのように見えますか? 'find〜/ test -type f -print0 | xargs -0 sed -i "s/syslog(\(。* \));/assert(syslog(\ 1));/g" 'まだ私の編集した質問に対するあなたのコメントがあなたの答えに応答したいと思います。 – user1032531

0

Perl互換の正規表現構文が必要な場合は、Perl(sic)を使用できます。かかわらず、私はあなたがUnix系っぽいプラットフォーム上にあることを前提に、一重引用符に切り替え、この特定のソリューションの

perl -i -pe 's/(?<=syslog\()(.*)(?=\);)/assert(syslog($1));/' /path/to/somewhere 

。二重引用符で囲まれたバックスラッシュは厄介です(二重にする必要があり、時にはそうでないこともあります)。

Perlは、置換パターンで\1を超えて$1を好むものの、後者は技術的にも機能します。

+0

あなたの特定の問題については、正規表現はlookbehindsなどなく簡単にEREやBRE正規表現にリファクタリングすることができます。あなたの要件がそれより複雑である場合や、正規表現の方言あなたは(明らかに)知っていて、他の多くの人が、おそらくこれが助けになるでしょう。 – tripleee

関連する問題