
*.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
(?<!...)
sed
ssed
perl
grep -Pr --include='*.tex' -lZ '\{fig/[^}]*(?<!\.png)\}' . |
xargs -r0 perl -pi.back -e 's:(\{fig/[^}]*(?<!\.png))\}:$1.png}:g'
使用すると、元の-i.back
ファイルは拡張子として保存されます.back
。
答え2
パターン検索を同時に実行できるため、使用時にはsed
必要ありません。grep
sed
{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
添付され、他のコンテンツが影響を受けていないことがわかります。