特にgrepとsed

特にgrepとsed

*.texファイルのすべての行を次の情報に置き換える方法を見つけようとしています。たとえば、次のようになります。

text{fig/titel/Logo}text

到着

text{fig/titel/Logo.png}text

私は試した:

egrep --include=*.tex -r ".*{fig/.*" *

変更したい行を提供します。しかし、例えば、sedコマンドをどのようにさらに使用できますか?

私はfindとsedを使ってみましたが、grepとsedを使ったことはありません。誰でも助けることができますか?

答え1

GNU(使用中のように見える)仮想ツール:

grep -r --include='*.tex' -lZ '{fig/.*}' . |
  xargs -r0 sed -i.back 's:\({fig/[^}]*\)}:\1.png}:g'

grep更新するファイルのリストを見つけて、そのファイルのみをsed更新してください。

.pngまたは、存在しないケースを追加する場合は、GNUには非正規の後方検索演算子を含むPCRE正規表現オプションがgrepありますが、GNUには(同じ系列に属するにもかかわらず)まだ1つはありません。次に切り替えます。-P(?<!...)sedssedperl

grep -Pr --include='*.tex' -lZ '\{fig/[^}]*(?<!\.png)\}' . |
  xargs -r0 perl -pi.back -e 's:(\{fig/[^}]*(?<!\.png))\}:$1.png}:g'

使用すると、元の-i.backファイルは拡張子として保存されます.back

答え2

パターン検索を同時に実行できるため、使用時にはsed必要ありません。grepsed

{fig/この場合、文字列を見つけて文字列を追加する非常に単純な式です。png

}これで終了文字で停止したいので、検索式をもう少しスマートにする必要がありますが、これは正常です。また、1行に複数の可能性があることも考慮する必要があります。

だから我々は最終的に

sed 's!{\(fig/[^}]*\)}!{\1.png}!g' 

たとえば、

$ cat x
untouched lines
text{fig/titel/Logo}text
more lines
text{fig/somethingelse/image}text
text{fig/stuff}text and {fig/morestuff}text

$ sed 's!{\(fig/[^}]*\)}!{\1.png}!g' x
untouched lines
text{fig/titel/Logo.png}text
more lines
text{fig/somethingelse/image.png}text
text{fig/stuff.png}text and {fig/morestuff.png}text

{fig/...}アイテムがpng添付され、他のコンテンツが影響を受けていないことがわかります。

関連情報