sedが無効なスラッシュを置き換える

sedが無効なスラッシュを置き換える

LaTeXファイルには次のコードがあります。

for \emph{service} in \emph{host}.resources:
    for \emph{file} in \emph{host}.resources:
        \underline{service}.requires.add(\underline{file})
    for \emph{package} in \emph{host}.resources:
        \underline{service}.requires.add(\underline{package})

これはリスト環境にあり、まだ emph コマンドと underline コマンドが必要なため、LaTeX コマンドをエスケープしました。結果は次のようになります。

for %*\emph{file}*) in %*\emph{host}*).resources:

次のsedコマンドを使用してこのプロセスを自動化しようとしています。

sed "s_\(\\emph{[a-z]*}\)_%\*\1\*)_"

ただし、これは次のような出力を生成します。

for \%*emph{dir}*) in \emph{host}.resources:

これには2つの問題があります。

  1. emph の前の '\' は LaTeX エスケープ文字の前に配置されます。
  2. sedは最初の一致のみを置き換えるようです。私はsedの貪欲な一致について知っているので、中かっこ内に.*の代わりに[az]*を使用します。しかし、これはうまくいかないようです。

私が望むことをするようにsedを取得する方法についてのアイデアはありますか?

ベストアンサー1

それを発見。

sedコマンドは二重引用符を使用するため、sedとbashの両方に対してスラッシュをエスケープする必要があります。 bashがエスケープを無視するように単一引用符を変更すると、最初の問題が解決されます。

「g」を追加すると(グローバル置換)は、今行のすべてと一致します。

最終結果:

sed 's_\(\\emph{[a-z]*}\)_%\*\1\*)_g' 

おすすめ記事